思路
假设有一个长度为 nnn 的数组 aaa(a0⋯an−1a_0\cdots a_{n-1}a0⋯an−1),则插入排序执行过程如下:
- 先将 a0a_0a0 已经排好序的数组当中。
- 遍历 a1⋯an−1a_1\cdots a_{n-1}a1⋯an−1。
- 每次外层遍历时内层再用 aia_iai 从尾部遍历一遍已排好的数组。
- 若 aj>aia_j>a_iaj>ai 则交换它们两个,否则退出内层遍历。此时可以保证 a0⋯aia_0\cdots a_ia0⋯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;
}

1866

被折叠的 条评论
为什么被折叠?



