冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
文字描述:
1,依次比较相邻的两个元素的大小,若a[i]>a[i+1]则交换位置,两两都比较一遍为一轮冒泡排序,让最大的元素排到最后
2,依次以上操作直到整个数组有序为止
简单演示1:
private static void bubble_1(int[] aa) {
for (int j = 0; j < aa.length; j++) {
for (int i1 = 0; i1 < aa.length-1; i1++) {//嵌套循环
if(aa[i1]>aa[i1+1]){//两个靠近的数值进行比较如果左边的大于右边的数值就进行交货
awap(aa,i1,i1+1);
}
}
System.out.println(Arrays.toString(aa));
}
}
结果:明明早就排序好了却还在排序,多余的循环
优化演示1:
解决一:加上一个boolean判断他们是否进行交换过,如果没有交换过证明已经交换完成
解决二:可以在减去主循环的次数,减少多余的循环
private static void bubble_2(int[] aa) {
for (int j = 0; j < aa.length; j++) {
Boolean b=false;//判断下面的排序循环是否进行了交换,默认为未交换
for (int i1 = 0; i1 < aa.length-1; i1++) {//嵌套循环
System.out.println("比较次数"+i1);//避免重复比较-1是预付下面的操作因为加一避免数组越界,
// -j是避免重复比较j没循环一次就比较好一次,所以减去他比较的
if(aa[i1]>aa[i1+1]){//两个靠近的数值进行比较如果左边的大于右边的数值就进行交货
awap(aa,i1,i1+1);
b=true;
}
}
if(!b){
break;
}
System.out.println(Arrays.toString(aa));
}
}
结果:循环次数减少,
优化演示2:
private static void bubble_2(int[] aa) {
for (int j = 0; j < aa.length; j++) {
Boolean b=false;//判断下面的排序循环是否进行了交换,默认为未交换
for (int i1 = 0; i1 < aa.length-1-j; i1++) {//嵌套循环
System.out.println("比较次数"+i1);//避免重复比较-1是预付下面的操作因为加一避免数组越界,
// -j是避免重复比较j没循环一次就比较好一次,所以减去他比较的
if(aa[i1]>aa[i1+1]){//两个靠近的数值进行比较如果左边的大于右边的数值就进行交货
awap(aa,i1,i1+1);
b=true;
}
}
if(!b){
break;
}
System.out.println(Arrays.toString(aa));
}
}
最终代码:
优化方式:每轮冒泡时,最后一次交换的索引可以做为下一轮冒泡排序的比较次数如果这个值为0,表示整个数值是有序的,就无须在进行排序退出循环即可。
private static void bubble_3(int[] aa) {
int num=aa.length-1;
for (int j = 0; j < aa.length; j++) {
int age=0;
for (int i1 = 0; i1 < num; i1++) {//嵌套循环
System.out.println("比较次数"+i1);//避免重复比较-1是预付下面的操作因为加一避免数组越界,
// -j是避免重复比较j没循环一次就比较好一次,所以减去他比较的
if(aa[i1]>aa[i1+1]){//两个靠近的数值进行比较如果左边的大于右边的数值就进行交货
awap(aa,i1,i1+1);
age=i1;
}
}
num=age;
if(num==0){
break;
}
System.out.println(Arrays.toString(aa));
}
}
选择排序与冒泡排序比较
1,二者平均时间复杂度都是O(n2)
2,,选择排序一般快于冒泡排序,因为交换次数少
3,如果集合有序度比较搞,则优先选择冒泡排序
3,冒泡排序属于稳定排序算法,选择排序属于不稳定排序算法