public static void sort2_up(int[] a){
int count = 0 ;
for(int i=0; i<a.length-1; i++){
for(int j=0; j<a.length-1; j++){
count++ ;
if(a[j] > a[j+1]){
int temp = 0 ;
temp = a[j] ;
a[j] = a[j+1] ;
a[j+1] = temp ;
}
}
}
System.out.println("#sort2_up forloop count - " + count);
}
执行:
int[] arr = new int[]{12,4,54,57,87,3,41,1,3,4,1,3,4,31,2} ;
sort2_up(arr);
System.out.println("最终结果:" + Arrays.toString(arr));
结果:
#sort2_up forloop count - 196
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
那么现在我们来看一下冒泡排序。
以上方法,第一层循环length-1次已经没有问题,那么来看下第二层循环。
每一次我们比较第j个元素和第j+1个元素,但是仔细分析,其实还是有无效比较,我们先把sort2_up中的每一次外层循环结果打印一下看看过程:
public static void sort2_up(int[] a){
int count = 0 ;
for(int i=0; i<a.length-1; i++){
for(int j=0; j<a.length-1; j++){
count++ ;
if(a[j] > a[j+1]){
int temp = 0 ;
temp = a[j] ;
a[j] = a[j+1] ;
a[j+1] = temp ;
}
}
System.out.println("#sort2_up i="+i+", result: " + Arrays.toString(a));
}
System.out.println("#sort2_up forloop count - " + count);
}
#sort2_up i=0, result: [4, 12, 54, 57, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 87]
#sort2_up i=1, result: [4, 12, 54, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 57, 87]
#sort2_up i=2, result: [4, 12, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 54, 57, 87]
#sort2_up i=3, result: [4, 3, 12, 1, 3, 4, 1, 3, 4, 31, 2, 41, 54, 57, 87]
#sort2_up i=4, result: [3, 4, 1, 3, 4, 1, 3, 4, 12, 2, 31, 41, 54, 57, 87]
#sort2_up i=5, result: [3, 1, 3, 4, 1, 3, 4, 4, 2, 12, 31, 41, 54, 57, 87]
#sort2_up i=6, result: [1, 3, 3, 1, 3, 4, 4, 2, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=7, result: [1, 3, 1, 3, 3, 4, 2, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=8, result: [1, 1, 3, 3, 3, 2, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=9, result: [1, 1, 3, 3, 2, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=10, result: [1, 1, 3, 2, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=11, result: [1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=12, result: [1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up i=13, result: [1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#sort2_up forloop count - 196
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
那么我们来看下内层循环,也就是j层循环:
每一次对第j个元素和第j+1个元素进行比较,循环length-1次。
问题出在循环length-1次上,为什么呢,因为从结果我们可以看到,其实每一轮都已经选出了一个最大值,比如第i=0次循环,选出了一个最大值,第i=1次循环,选出了除上一次最大值之外的最大值,以此类推。
也就是说,j层循环中,每次循环,后面的比较完全是多余的,多比较了多少次呢?答案是 i 次。
第一轮循环,也就是i=0,此时需要在内层比较所有元素大小,最终选举出一个最大值;当第二轮循环时,i=1,最大值已经选举出,此时已没有必要再进行最后一轮j循环,j循环层只需要执行length-1-i次即可,以此类推。
这就是冒泡循环的思想,每一轮循环,冒泡选出一个最大值,放到末尾: