冒泡排序及其复杂度

Posted Vincent(朱志强)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序及其复杂度相关的知识,希望对你有一定的参考价值。

冒泡排序

什么是冒泡排序

冒泡排序算法通过不断比较和交换(如有必要)数据集相邻的两个元素,直到他们有序为止。
就像水底的气泡往水面上浮动一样,每一轮的比较和交换都会从无序区域浮出一个最大数,抵达有序区域的起始位置。
假定我们现在要按照升序对一个数组进行排序。数组为:[-2,45,0,11,-9]

冒泡排序工作机制

首轮(第0轮)比较和交换

在首轮比较和交换前,无序区域是整个数组,有序区域为空集。

  1. 比较无序区域的第一个和第二个元素,示例数组中为-2和45。
  2. 如果前者大于后者,那么交换它们的位置。
  3. 继续比较第二元素和第三个元素,如果前者大于后者,交换它们的位置。
  4. 上述过程持续到倒数第二个元素和最后一个元素的比较和交换。
第0轮

重复上述过程,继续比较和交换

第1轮
第2轮
第3轮

每一轮下来,比较和交换都是从无序区域的第一个元素开始,最后一个元素结束。如此这般,无序数组的最大的一个元素放到了无序数组的结尾,也就成了新的有序数组的开头。重复这个过程,直至所有元素都处于正确的位置。

伪代码

bubbleSort(array)
  swapped <- false
  for i <- 1 to indexOfLastUnsortedElement-1
    if leftElement > rightElement
      swap leftElement and rightElement
      swapped <- true
end bubbleSort

java实现

    public static void bubbleSort(int[] numbers) 
        //检验入参,如果数组为null或元素小于两位,则无需比较
        if (numbers == null || numbers.length < 2) 
            return;
        
        //轮数,总共需要n-1轮比较和交换,n-1个数都位于正确位置了,最后一个自然也就位了
        for (int round = 0; round < numbers.length - 1; round++) 
            //标识一轮比较中是否发生了交换
            boolean swapped = false;
            //每一轮对无序区域进行两两比较
            for (int index = 0; index < numbers.length - round - 1; index++) 
                //如果牵着大于后者,则交换位置
                if (numbers[index] > numbers[index + 1]) 
                    int temp = numbers[index];
                    numbers[index] = numbers[index + 1];
                    numbers[index + 1] = temp;
                    swapped = true;
                
            
            //如果本轮没有发生交换,说明当前无序区域本身是有序的,不需要再进行下一轮比较了
            if (!swapped) 
                return;
            
        
    

复杂度及稳定性

时间复杂度空间复杂度稳定性
最好 O ( n ) O(n) O(n)最差 O ( n 2 ) O(n^2) O(n2)平均 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定

以上是关于冒泡排序及其复杂度的主要内容,如果未能解决你的问题,请参考以下文章

GO-冒泡排序算法

冒泡排序及其时间空间复杂度

交换排序------冒泡法 及其优化

各种排序算法思想复杂度及其java程序实现

排序算法——冒泡排序

排序算法