Skip to content

简单选择排序

为什么需要简单选择排序

冒泡排序每发现一对逆序就要做一次交换,交换次数较多。能不能每一轮只做一次交换,把最小的元素直接放到最终位置?简单选择排序正是基于这个思路:每轮从未排序部分选出最小元素,与未排序部分的第一个元素交换,从而将交换次数降到最低。

408 考研中,简单选择排序是选择类排序的基础,也是理解堆排序的前置知识。它的比较次数固定、不受输入数据影响这一特点,是选择题的常见考点。

核心思想

简单选择排序的核心操作:

  • 选最小:在未排序区间 [i, n-1] 中找到最小元素的下标 min
  • 交换归位:将 a[min]a[i] 交换,a[i] 就到达最终位置
  • 缩小范围i++,未排序区间缩小一个元素,重复上述过程

每完成一轮,已排序区间增加一个元素,未排序区间减少一个元素。共需 n-1 轮即可完成排序。

第0轮: [待排序区间 ——————————————————]
第1轮: [已排序] [待排序区间 ——————————]
第2轮: [已排序——] [待排序区间 ————————]
 ...
第n-2轮: [已排序————————————————] [待排]

交互可视化

通过下方的交互动画,你可以逐步观察简单选择排序的执行过程:

加载可视化中...

操作详解

算法思路

关键步骤:

  1. 外层循环 i0n-2,表示当前要确定的位置
  2. 内层循环在 [i, n-1] 中找最小元素的下标 min
  3. min != i,交换 a[i]a[min]
  4. 重复直到所有位置确定
c
void SelectionSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int min = i;
        for (int j = i + 1; j < n; j++) {
            if (a[j] < a[min])
                min = j;
        }
        if (min != i) {
            int tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
    }
}

排序过程详解

以数组 {3, 1, 4, 1, 5} 为例,演示完整排序过程:

轮次未排序区间找到最小值交换操作数组状态
初始{3, 1, 4, 1, 5}
第1轮[0, 4]a[1]=1a[0]↔a[1]{1, 3, 4, 1, 5}
第2轮[1, 4]a[3]=1a[1]↔a[3]{1, 1, 4, 3, 5}
第3轮[2, 4]a[3]=3a[2]↔a[3]{1, 1, 3, 4, 5}
第4轮[3, 4]a[3]=4无需交换{1, 1, 3, 4, 5}

共进行 4 轮(n-1 轮),每轮在未排序区间扫描一遍找最小值,最多做 1 次交换。

不稳定性分析

简单选择排序是不稳定的排序算法。

经典反例:{2, 2, 1}(用下标区分两个 2:2₁, 2₂, 1)

轮次操作结果
初始{2₁, 2₂, 1}
第1轮最小值为 1,a[0]↔a[2]{1, 2₂, 2₁}

排序后 2₂ 排在 2₁ 前面,两个相等元素的相对顺序发生了改变,因此不稳定。

根本原因:交换操作会把 a[i] 直接甩到后面的位置,跨越了中间与它相等的元素。

复杂度分析

指标复杂度说明
比较次数n(n-1)/2与初始序列无关,始终为 O(n²)
最好交换次数0已有序,无需交换
最坏交换次数n-1每轮都需交换
时间复杂度(所有情况)O(n²)比较次数固定,不随输入变化
空间复杂度O(1)仅需常数级辅助变量
稳定性不稳定反例:{2, 2, 1}

与冒泡排序的对比

对比项简单选择排序冒泡排序
比较次数固定 n(n-1)/2最好 O(n),最坏 O(n²)
交换次数最多 n-1 次最坏 O(n²) 次
对输入敏感否(比较次数不变)是(有序时可提前终止)
稳定性不稳定稳定
空间复杂度O(1)O(1)

简单选择排序的优势在于交换次数少(每轮最多 1 次),当数据交换代价较大时优于冒泡排序。

考研高频考点

  • ⭐ 比较次数始终为 n(n-1)/2,与初始序列无关(选择题高频)
  • ⭐ 不稳定排序,能用 {2, 2, 1} 举反例(选择题/简答题必考)
  • ⭐ 时间复杂度始终 O(n²),不存在"最好 O(n)"的情况(易与冒泡混淆)
  • ⭐ 与冒泡排序的对比:交换次数、稳定性、对输入的敏感性(简答题)
  • 交换次数最多 n-1 次,远少于冒泡排序(偶尔考)
  • 简单选择排序是堆排序的基础思想(理解题)