📘GESP 4级 · 插入排序

2026-08-31
⭐⭐ GESP 4级

📖概念讲解

【考点 · 4级】插入排序——基础排序算法,属于排序 + 交换类考点。

【说人话】

想象你打扑克牌——手里的牌已经排好序,每摸一张新牌就从右往左找到合适位置插进去。这就是插入排序的核心:把数组分成"已排序"和"未排序"两部分,每次从未排序区取一个,插入已排序区的正确位置。

时间复杂度:最好 O(n)(已经有序时),最坏 O(n²)(完全逆序时)。空间复杂度 O(1),是原地排序。

⚡ 易错点:① 内层循环的条件是 j >= 0 && a[j] > key,别忘了 j >= 0 防越界!② 关键值 key 先暂存,不是直接交换,而是边移动边腾位置;③ 插入排序是稳定排序(相同元素不改变相对顺序),这是它比冒泡排序的优势。

💻代码示例

1#include <iostream>
2#include <vector>
3using namespace std;
4
5void insertionSort(vector<int>& a) {
6 int n = a.size();
7 for (int i = 1; i < n; i++) { // 从第2个元素开始,逐个插入
8 int key = a[i]; // 暂存当前要插入的值
9 int j = i - 1; // j 指向已排序区的最后一个
10 while (j >= 0 && a[j] > key) { // 比key大的元素都往右移
11 a[j + 1] = a[j]; // 右移腾出位置
12 j--; // 继续往左找
13 }
14 a[j + 1] = key; // 插入到正确位置
15 }
16}
17
18int main() {
19 vector<int> a = {5, 2, 4, 6, 1, 3};
20 insertionSort(a); // 调用插入排序
21 for (int x : a) cout << x << " ";
22 return 0;
23}
24# 输出:1 2 3 4 5 6

🧩互动小测

Q1:插入排序的时间复杂度最坏是多少?

Q2:插入排序是稳定排序吗?

Q3:插入排序中,a[j] > key 时执行的是?

🏋️动手练一练

📝 编程练习

题目:给定一个包含 n 个整数的数组,请用插入排序将其从小到大排序,输出排序后的结果。

输入格式:第一行 n(1 ≤ n ≤ 1000),第二行 n 个整数。
输出格式:一行,排序后的 n 个整数,空格隔开。

提示:本题要求使用插入排序,不要用 sort()。注意 j 移动到 -1 时停止,key 放到 a[0]。
参考答案:
#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n; cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    // 插入排序
    for (int i = 1; i < n; i++) {
        int key = a[i];          // 暂存当前元素
        int j = i - 1;
        while (j >= 0 && a[j] > key) {
            a[j+1] = a[j];      // 右移腾位
            j--;
        }
        a[j+1] = key;           // 插入正确位置
    }
    for (int i = 0; i < n; i++)
        cout << a[i] << (i < n-1 ? " " : "\n");
    return 0;
}
        

要点:插入排序虽然慢,但在数据量小(n ≤ 50)或几乎有序时非常高效。GESP 4级考试常考手写插入排序,注意边界条件别写错!

📝易错点提醒

1️⃣ key 必须先暂存——别直接用 a[i] 比较然后移动,移动过程中 a[i] 的值会被覆盖!

2️⃣ j >= 0 不能省——当 key 比所有元素都小时,j 会减到 -1,不判断就数组越界了。

3️⃣ 是"腾位置"不是"交换"——插入排序每轮把大元素统一右移一步,最后把 key 放进去。交换法(swap相邻)也能排但效率差一倍。

4️⃣ 稳定 vs 不稳定——插入排序是稳定的,冒泡排序也是。选择排序是不稳定的。考试爱考这个区别!

5️⃣ 适用场景——插入排序在 n 很小或数据基本有序时优于快排,C++ STL 的 sort 内部对小区间就会切换到插入排序。

学完这个知识点后点一下