冒泡排序

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

以升序为例,冒泡排序每次检查相邻两个元素,如果前面的元素大于后面的元素,就将相邻两个元素交换。当没有相邻的元素需要交换时,排序就完成了。

不难发现,我们最多需要扫描 n遍数组才能完成排序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void bubble_sort() {
  for (int i = 1; i <= n; i++) {
    bool flag = false;
    for (int j = 1; j < n; j++)
      if (a[j] > a[j + 1]) {
        flag = true;
        int t = a[j];
        a[j] = a[j + 1];
        a[j + 1] = t;
      }
    if (!flag) break;  //如果没有执行交换操作,说明数列已经有序
  }
}

在序列完全有序时,该算法只需遍历一遍数组,不用执行任何交换操作,时间复杂度为 O(n)。在最坏情况下,冒泡排序要执行 \frac{(n-1)n}{2}次交换操作,时间复杂度为 O(n^2)。在平均情况下,冒泡排序的时间复杂度也是 O(n^2)


评论