Java冒泡排序算法实例分析(2)

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次即可,以此类推。

这就是冒泡循环的思想,每一轮循环,冒泡选出一个最大值,放到末尾:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e2f5b2079f671f0f5f83ffa7ef57352f.html