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


    内部排序之冒泡排序法


    冒泡排序(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();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果 不用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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    执行结果 使用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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    算法分析

    时间复杂度

    当数组的元素个数是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)

  • 相关阅读:
    初创企业应该选一款怎样的客服系统?
    【数据结构】七种排序方法,一篇文章掌握
    三维电子沙盘数字沙盘M3DGIS大数据人工智能开发课程第8课
    中秋快乐! Happy Mid-autumn Festival!
    使用IntelliJ IDEA查看接口的全部实现方法
    [附源码]Python计算机毕业设计SSM健康饮食推荐系统(程序+LW)
    【LeetCode】【剑指offer】【队列的最大值(二)】
    Redis变慢?深入浅出Redis性能诊断系列文章(一)
    go语言和redis数据库
    关于FPGA对 DDR4 (MT40A256M16)的读写控制 3
  • 原文地址:https://blog.csdn.net/weixin_43820556/article/details/126787767