冒泡排序

1176 YBTJ1176 谁考了第k名

定义

冒泡排序(英语:Bubble sort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。

过程

它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时,排序就完成了。

经过 ii 次扫描后,数列的末尾 ii 项必然是最大的 ii 项,因此冒泡排序最多需要扫描 n1n-1 遍数组就能完成排序。

bubble

性质

稳定性

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

时间复杂度

在序列完全有序时,冒泡排序只需遍历一遍数组,不用执行任何交换操作,时间复杂度为 O(n)O(n)

在最坏情况下,冒泡排序要执行 (n1)n2\frac{(n-1)n}{2} 次交换操作,时间复杂度为 O(n2)O(n^2)

冒泡排序的平均时间复杂度为 O(n2)O(n^2)

代码实现

C++

// C++ Version
// 假设数组的大小是n+1,冒泡排序从数组下标1开始
void bubble_sort(int *a, int n) {
  bool flag = true;
  while (flag) {
    flag = false;
    for (int i = 1; i < n; ++i) {
      if (a[i] > a[i + 1]) {
        flag = true;
        int t = a[i];
        a[i] = a[i + 1];
        a[i + 1] = t;
      }
    }
  }
}

选择排序

1177 YBTJ1177 奇数单增序列

定义

选择排序(英语:Selection sort)是一种简单直观的排序算法。它的工作原理是每次找出第 ii 小的元素(也就是 Ai..nA_{i..n} 中最小的元素),然后将这个元素与数组第 ii 个位置上的元素交换。 image

性质

稳定性

由于 swap(交换两个元素)操作的存在,选择排序是一种不稳定的排序算法。

时间复杂度

选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为 O(n2)O(n^2)

代码实现

C++

// C++ Version
void selection_sort(int* a, int n) {
  for (int i = 1; i < n; ++i) {
    int ith = i;
    for (int j = i + 1; j <= n; ++j) {
      if (a[j] < a[ith]) {
        ith = j;
      }
    }
    std::swap(a[i], a[ith]);
  }
}