思路
假设有一个长度为 n n n 的数组 a a a( a 0 ⋯ a n − 1 a_0\cdots a_{n-1} a0⋯an−1),则插入排序执行过程如下:
- 先将 a 0 a_0 a0 已经排好序的数组当中。
- 遍历 a 1 ⋯ a n − 1 a_1\cdots a_{n-1} a1⋯an−1。
- 每次外层遍历时内层再用 a i a_i ai 从尾部遍历一遍已排好的数组。
- 若 a j > a i a_j>a_i aj>ai 则交换它们两个,否则退出内层遍历。此时可以保证 a 0 ⋯ a i a_0\cdots a_i a0⋯ai 是有序的。
代码
#include <iostream>
using namespace std;
int a[int(1e7)];
void InsertionSort(int *a, int n) {
for (int i = 1; i < n; ++i) {
int val = a[i];
// 将a[i]插入有序序列a[0..i-1]
int j = i - 1;
while (j >= 0 && a[j] > val) a[j + 1] = a[j--]; // 将a[j]向后移动一位
a[j + 1] = val; // 插入a[i]
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
InsertionSort(a, n);
for (int i = 0; i < n; ++i) cout << a[i] << ' ';
return 0;
}