数据结构与算法之冒泡排序

冒泡排序(Bubble Sort)

每次比较相邻的两个数的大小。一次冒泡会找出数据中的最大值,放到数组最后。
n个数组的冒泡排序,最多需要执行n次冒泡。

我们按照从小到大的目标来进行冒泡排序。
初始数据:
[6,2,7,1,2,10,3]
第一次冒泡,10应该排在最后,即:
[2,6,7,1,2,10,3]
[2,6,1,7,2,10,3]
[2,6,1,2,7,10,3]
[2,6,1,2,7,3,10]
我们注意到最后一次输出,作为数组中最大的数10,排在了最后的位置。
其中6和2互换了位置,1和7,2和7也换了位置,这些就是上面提到的逻辑:每次比较相连的两个数,前数大于后数则交换(目标是最终是按照从小到大排列)。

代码:

public static void sort(int[] arrs) {
        System.out.println("排序前的数组:");
        Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
        System.out.println();
        //只控制循环的次数,有几个数就循环几次
        for(int i=0; i<arrs.length; i++) {
            //比较交换,第一次循环,比较n-1次,第二次循环,比较n-2次
            //j<arrs.length-i-1,这里减i是将已经排序的数排除掉,减1是因为每次循环中需要比较的次数是n-1,比如5个数,你只需要比较4次
            for(int j=0; j<arrs.length-i-1;j++) {
                if(arrs[j]>arrs[j+1]) {
                    int temp = arrs[j];
                    arrs[j] = arrs[j+1];
                    arrs[j+1] = temp;
                }
            }
            System.out.println("第"+i+1+"次冒泡:");
            Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
            System.out.println();
        }

        System.out.println("排序后的数组:");
        Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
    }

输出:

排序前的数组:
6 2 7 1 2 10 3 
第1次冒泡:
2 6 1 2 7 3 10 
第2次冒泡:
2 1 2 6 3 7 10 
第3次冒泡:
1 2 2 3 6 7 10 
第4次冒泡:
1 2 2 3 6 7 10 
第5次冒泡:
1 2 2 3 6 7 10 
第6次冒泡:
1 2 2 3 6 7 10 
第7次冒泡:
1 2 2 3 6 7 10 
排序后的数组:
1 2 2 3 6 7 10 
Process finished with exit code 0

如果数组在排序过程中已经是有序的了(最终排序结果),则不需要再进行后续的冒泡了,则直接退出,代码如下:

public static void sort2(int[] arrs) {
        System.out.println("排序前的数组:");
        Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
        System.out.println();
        //只控制循环的次数,有几个数就循环几次
        for(int i=0; i<arrs.length; i++) {
            boolean flag = false;
            //比较交换,第一次循环,比较n-1次,第二次循环,比较n-2次
            //j<arrs.length-i-1,这里减i是将已经排序的数排除掉,减1是因为每次循环中需要比较的次数是n-1,比如5个数,你只需要比较4次
            for(int j=0; j<arrs.length-i-1;j++) {
                if(arrs[j]>arrs[j+1]) {
                    int temp = arrs[j];
                    arrs[j] = arrs[j+1];
                    arrs[j+1] = temp;
                    flag = true;
                }
            }
            if(!flag) {
                System.out.println("排序后的数组:");
                Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
                return;
            }
        }
        System.out.println("排序后的数组:");
        Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
    }