重温基础算法内部排序之冒泡排序法

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重温基础算法内部排序之冒泡排序法相关的知识,希望对你有一定的参考价值。

内部排序之冒泡排序法

文章目录


冒泡排序(Bubble Sort)也是一种简单快速的排序算法。它重复地遍历过要排序的数列,一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

主要思想

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了本次遍历确定的最后一个值。
  4. 重复上面的步骤,直到没有任何一对数字需要比较。

过程演示

动图制作:
算法动画网址:https://visualgo.net/zh/sorting
gif录屏软件:GifCam 下载地址:https://download.csdn.net/download/weixin_43820556/86512977

  1. 第1趟排序

    从数组下标0开始,不断与相邻的比较与交换,确定最大值9,并移动到了数组最后的位置

    第1次排序后: 6 7 3 1 5 2 4 8 9

  2. 第2趟排序

    从数组下标0开始,不断与相邻的比较与交换,确定最大值8,并移动到了数组最后的位置-1

    第2次排序后: 6 3 1 5 2 4 7 8 9

  3. 第3趟排序

    从数组下标0开始,不断与相邻的比较与交换,确定最大值7,并移动到了数组最后的位置-2
    第3次排序后: 3 1 5 2 4 6 7 8 9

  4. 第4趟排序

    从数组下标0开始,不断与相邻的比较与交换,确定最大值6,并移动到了数组最后的位置-3

    第4次排序后: 1 3 2 4 5 6 7 8 9

  5. 第5趟排序

    从数组下标0开始,不断与相邻的比较与交换,确定最大值5,并移动到了数组最后的位置-4
    第5次排序后: 1 2 3 4 5 6 7 8 9

  6. 此时数组已经完成了排序。从第6~8趟排序的排序其实可以忽略。

JAVA代码

package sort;

public class BubbleSort 
    public static void main(String[] args) 
        int[] o = 7, 6, 9, 3, 1, 5, 2, 4, 8;
        System.out.print("排序前: ");
        for (int t : o) 
            System.out.print(t);
            System.out.print(" ");
        
        System.out.println();

        // 算法部分
        for (int i = 1; i < o.length; i++) 
            // flag代表数组是否已经有序,当不发生元素交换时,代表数组有序了
            boolean flag = true;
            for (int j = 0; j < o.length - i; j++) 
                if (o[j] > o[j + 1]) 
                    int tmp = o[j];
                    o[j] = o[j + 1];
                    o[j + 1] = tmp;
                    flag = false;
                
            

            // 数组已经有序,跳过无效的循环
            if (flag) 
                break;
            

            System.out.print("第" + i + "次排序后: ");
            for (int t : o) 
                System.out.print(t);
                System.out.print(" ");
            
            System.out.println();
        

        System.out.print("排序后: ");
        for (int t : o) 
            System.out.print(t);
            System.out.print(" ");
        
        System.out.println();

    

执行结果 不用flag

排序前: 7 6 9 3 1 5 2 4 81次排序后: 6 7 3 1 5 2 4 8 92次排序后: 6 3 1 5 2 4 7 8 93次排序后: 3 1 5 2 4 6 7 8 94次排序后: 1 3 2 4 5 6 7 8 95次排序后: 1 2 3 4 5 6 7 8 96次排序后: 1 2 3 4 5 6 7 8 97次排序后: 1 2 3 4 5 6 7 8 98次排序后: 1 2 3 4 5 6 7 8 9 
排序后: 1 2 3 4 5 6 7 8 9 

执行结果 使用flag

排序前: 7 6 9 3 1 5 2 4 81次排序后: 6 7 3 1 5 2 4 8 92次排序后: 6 3 1 5 2 4 7 8 93次排序后: 3 1 5 2 4 6 7 8 94次排序后: 1 3 2 4 5 6 7 8 95次排序后: 1 2 3 4 5 6 7 8 9 
排序后: 1 2 3 4 5 6 7 8 9 

算法分析

时间复杂度

当数组的元素个数是n,那么第一趟需要(n-1)次比较。第二趟需要(n-1-1)次比较,直到第(n-1)趟是1次比较。不然发现比较次数的总和是 ∑ i = n 2 i − 1 = n ( n − 1 ) / 2 = O ( n 2 ) \\displaystyle \\sum_i=n^2 i-1=n(n-1)/2=O(n^2) i=n2i1=n(n1)/2=O(n2)

空间复杂度

算法只申请了几个固定的大小的空间来协助排序,空间复杂度为 O ( 1 ) O(1) O(1)

以上是关于重温基础算法内部排序之冒泡排序法的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之快速排序法

重温基础算法内部排序之归并排序法

重温基础算法内部排序之归并排序法

重温基础算法内部排序之希尔排序法

重温基础算法内部排序之基数排序法

重温基础算法内部排序之基数排序法