数据结构(四十二)冒泡排序(O(n²))

Posted bigjunoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(四十二)冒泡排序(O(n²))相关的知识,希望对你有一定的参考价值。

  一、冒泡排序的定义

  冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

 

  二、冒泡排序的实现

  1.非标准冒泡排序算法--最简单的交换排序

  技术分享图片

  思想就是让每一个关键字,都和它后面的每一个关键字比较,如果大则交换,这样第一位置的关键字在一次循环后一定变成最小值。

  然而缺陷就是,在排序号1和2之后,数字3反而到了最后一位。

// 不是标准的冒泡排序算法,因为它不满足"两两比较相邻记录"的冒泡排序思想,是最简单的交换排序而已。
    public static void BubbleSort0(int[] L) {
        for (int i = 0; i < L.length; i++) {
            for (int j = i + 1; j < L.length; j++) {
                if (L[i] > L[j]) {
                    Assistant_And_Test.swap(L, i, j);
                }
            }
        }
    }
  int[] array2 = {9,1,5,8,3,7,4,6,2};
  当i=0时,9与1交换,因为1比其他位置的数字都小,所以1在第0位
  当i=1时,9与5交换,5与3交换,3与2交换,所以2在第1位
  ...

  2.标准冒泡排序算法

  技术分享图片技术分享图片

    // 标准的冒泡排序算法
    public static void BubbleSort1(int[] L) {
        for (int i = 0; i < L.length; i++) {
            for (int j = L.length - 2; j >= i; j--) {
                if (L[j] > L[j + 1]) {
                    swap(L, j, j + 1);
                }
            }
        }
    }

  int[] array2 = {9,1,5,8,3,7,4,6,2};
  
当i=0时,j从7开始,6与2交换,4与2交换,7与2交换,3与2交换,8与2交换,5与2交换,9与1交换,1排在第0位,2的位置也上升了
  
当i=1时,j从7开始,7与4交换,8与3交换,9与2交换,2排在第1位,3和4的位置也上升了
  ...

   3.改进的冒泡排序

  技术分享图片

  假设待排序的序列为{2,1,3,4,5,6,7,8,9},当i=0时,交换2和1,此时序列已经有序,但是算法仍然将i=1到8以及每个循环中的j循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大多余了。因此,增加一个标记变量flag来实现这一算法的改进。

    // 改进的冒泡排序算法,增加一个标记变量flag
    public static void BubbleSort2(int[] L) {
        boolean flag = true;    // 用flag来做标记
        for (int i = 0; i < L.length && flag; i++) {
            flag = false;        // 初始值为false
            for (int j = L.length - 2; j >= i; j--) {
                if (L[j] > L[j + 1]) {
                    swap(L, j, j + 1);
                    flag = true;// 如果有数据交换,则flag为true
                }
            }
        }
    }
  
  int[] array3 = {2,1,3,4,5,6,7,8,9};
  i=0,flag=false,j=7开始,8和9不交换,7和8不交换,...2和1交换,flag=true,进入for循环
  i=1,flag=false,j=7开始,没有交换的,所以flag仍然等于false,不进入for循环,
  ...

  

  三、冒泡排序算法的时间复杂度

  对于改进的冒泡排序来说,如果待排序的序列本身就是有序的,那么需要比较n-1次,交换0次,时间复杂度为O(n)。最坏的情况,即待排序的序列是逆序的情况下,此时需要比较1+2+3+...+(n-1) = n(n-1)/2次,并移动n(n-1)/2次,所以总的时间复杂度为O(n2)
















以上是关于数据结构(四十二)冒泡排序(O(n²))的主要内容,如果未能解决你的问题,请参考以下文章

排序算法时间复杂度为O(n²)的排序算法

为啥快速排序算法的时间复杂度是O(nlogn)而不是O(n²)?

《剑指Offer》题四十一~题五十

冒泡排序

冒泡排序快速排序的区别与联系

冒泡排序为什么最佳负责度为O(n)