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

public static void bubbleSort(int[] arr) {
        int count = 0 ;
        System.out.println("待排序数组:" + Arrays.toString(arr));
        for (int i=0;i<arr.length-1;i++) {
            for (int j=0;j<arr.length-1-i;j++) {
                count++ ;
                if (arr[j]>arr[j+1]) {
                    int temp = arr[j] ;
                    arr[j] = arr[j+1] ;
                    arr[j+1] = temp ;
                }
            }
            System.out.println("第" + (i+1) + "次排序结果:" + Arrays.toString(arr));
        }
        System.out.println("#bubbleSort forloop count - " + count);
    }

执行一下:

int[] arr = new int[]{12,4,54,57,87,3,41,1,3,4,1,3,4,31,2} ;
        bubbleSort(arr);
        System.out.println("最终结果:" + Arrays.toString(arr));

结果:

待排序数组:[12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2]
#第1次排序结果:[4, 12, 54, 57, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 87]
#第2次排序结果:[4, 12, 54, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 57, 87]
#第3次排序结果:[4, 12, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 54, 57, 87]
#第4次排序结果:[4, 3, 12, 1, 3, 4, 1, 3, 4, 31, 2, 41, 54, 57, 87]
#第5次排序结果:[3, 4, 1, 3, 4, 1, 3, 4, 12, 2, 31, 41, 54, 57, 87]
#第6次排序结果:[3, 1, 3, 4, 1, 3, 4, 4, 2, 12, 31, 41, 54, 57, 87]
#第7次排序结果:[1, 3, 3, 1, 3, 4, 4, 2, 4, 12, 31, 41, 54, 57, 87]
#第8次排序结果:[1, 3, 1, 3, 3, 4, 2, 4, 4, 12, 31, 41, 54, 57, 87]
#第9次排序结果:[1, 1, 3, 3, 3, 2, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第10次排序结果:[1, 1, 3, 3, 2, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第11次排序结果:[1, 1, 3, 2, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第12次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第13次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第14次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#bubbleSort forloop count - 105
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]

冒泡排序的思想,说直白点就是每次冒泡选出最大值,并且每次选出的最大值不参与下次排序。

冒泡排序的进一步优化:

上面的冒泡排序算法确实已经很高效了,但是我们仔细看输出结果,第12次、13次、14次,其排序结果相同,也就是说,实际到第12次排序已经完成,13、14次为无效操作。我们加个标记,对过程进行进一步优化:

public static void bubbleSort_up(int[] arr) {
        int count = 0 ;
        System.out.println("待排序数组:" + Arrays.toString(arr));
        for (int i=0;i<arr.length-1;i++) {
            boolean isComplete = true ;
            for (int j=0;j<arr.length-1-i;j++) {
                count++ ;
                if (arr[j]>arr[j+1]) {
                    int temp = arr[j] ;
                    arr[j] = arr[j+1] ;
                    arr[j+1] = temp ;
                    if (isComplete)
                        isComplete = false ;
                }
            }
            System.out.println("#第" + (i+1) + "次排序结果:" + Arrays.toString(arr));
            if (isComplete)
                break;
        }
        System.out.println("#bubbleSort_up forloop count - " + count);
    }

我们每一次外层循环开始时,记录一个完成排序标记,如果内层循环有变动,则标记为false,否则为true,看结果:

待排序数组:[12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2]
#第1次排序结果:[4, 12, 54, 57, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 87]
#第2次排序结果:[4, 12, 54, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 57, 87]
#第3次排序结果:[4, 12, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 54, 57, 87]
#第4次排序结果:[4, 3, 12, 1, 3, 4, 1, 3, 4, 31, 2, 41, 54, 57, 87]
#第5次排序结果:[3, 4, 1, 3, 4, 1, 3, 4, 12, 2, 31, 41, 54, 57, 87]
#第6次排序结果:[3, 1, 3, 4, 1, 3, 4, 4, 2, 12, 31, 41, 54, 57, 87]
#第7次排序结果:[1, 3, 3, 1, 3, 4, 4, 2, 4, 12, 31, 41, 54, 57, 87]
#第8次排序结果:[1, 3, 1, 3, 3, 4, 2, 4, 4, 12, 31, 41, 54, 57, 87]
#第9次排序结果:[1, 1, 3, 3, 3, 2, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第10次排序结果:[1, 1, 3, 3, 2, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第11次排序结果:[1, 1, 3, 2, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第12次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第13次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#bubbleSort_up forloop count - 104
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]

少一次,这是因为我们这一组数字只少排序了最后一个循环,最后一次j=length-1-i,只有一次排序操作,我们换一组数来看效果:

执行:

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

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