跳至主要內容

冒泡排序

苏文广2024年1月11日大约 2 分钟算法算法排序

冒泡排序

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

算法描述

  1. 从数列中挑出最小(大)元素,依次放到数列的起始位置;
  2. 再从剩下的元素中挑出最小(大)元素,放到已排序序列的末尾;
  3. 重复步骤2,直到所有元素排序完成。

示例

对数列 {5, 3, 8, 6, 4} 进行冒泡排序:

第一轮:

  • 比较5和3,发现5>3,交换位置,数列变成 {3, 5, 8, 6, 4};
  • 比较5和8,发现5<8,位置不变,数列还是 {3, 5, 8, 6, 4};
  • 比较8和6,发现8>6,交换位置,数列变成 {3, 5, 6, 8, 4};
  • 比较8和4,发现8>4,交换位置,数列变成 {3, 5, 6, 4, 8};
    第一轮结束,此时最大元素8已经排好序,接下来对剩下的数列 {3, 5, 6, 4} 进行冒泡排序。

第二轮:

  • 比较3和5,发现3<5,位置不变,数列还是 {3, 5, 6, 4};
  • 比较5和6,发现5<6,位置不变,数列还是 {3, 5, 6, 4};
  • 比较6和4,发现6>4,交换位置,数列变成 {3, 5, 4, 6};
    第二轮结束,此时次大元素6已经排好序,剩下的数列 {3, 5, 4} 继续冒泡排序。

第三轮:

  • 比较3和5,发现3<5,位置不变,数列还是 {3, 5, 4};
  • 比较5和4,发现5>4,交换位置,数列变成 {3, 4, 5};
    第三轮结束,此时第三大元素5已经排好序,剩下的数列 {3, 4} 继续冒泡排序。

第四轮:

  • 比较3和4,发现3<4,位置不变,数列还是 {3, 4};
    第四轮结束,此时最小元素3已经排好序,整个数列排序完成。

复杂度分析

  • 最好情况:当数组已经按照排序需求排好时,只需进行一次遍历,时间复杂度为O(n);
  • 最坏情况:当数组是逆序排列时,需要进行n-1次遍历,时间复杂度为O(n^2);
  • 平均情况:需要进行n-1次遍历,时间复杂度为O(n^2)。

冒泡排序是一种稳定的排序算法。

public class bubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n-1; i++) {
            for (int j = 0; j < n-i-1; j++) {
                if (arr[j] > arr[j+1]) {
                    // 交换arr[j]和arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}