插入排序:
时间复杂度:O(n^2)
空间复杂度:O(1)
性能测试:
用选择排序做对比。
10k 个随机数字排序:
插入排序 : 0.251472 s
插入排序优化版 : 0.076234 s
选择排序 : 0.114651 s
10k 个接近有序数字排序:
插入排序 : 0.007583 s
插入排序优化版 : 0.002242 s
选择排序 : 0.114229 s
基本思路:
把当前这个元素放在前面合适的位置上。
当前这个元素比前面的小,和前面的交换,发现交换后还比前面的小,继续交换,当前元素为第一个或者不比前面的元素小了就停止。
void insertSort(T arr[], int n) {
for (int i = 1; i < n; ++i) {
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
swap(arr[j], arr[j - 1]);
}
}
}
优化:
比如:4 3 5 6 2 1
当前元素 4,原地不动。
当前元素 3,应该放在 4 的前面:3 4 5 6 2 1
当前元素 5,不动。
当前元素 6,不动。
当前元素 2,应该放在 3 的前面:2 3 4 5 6 1
当前元素 1,应该放在 2 的前面:1 2 3 4 5 6
优化版在每次只发生一次交换,所以比基础版效率高。
void insertSort(int arr[], int n) {
for (int i = 1; i < n; ++i) {
// 当前元素 e
int e = arr[i];
int j;
// 从 e 的位置向前找,找到合适放 e 的位置,顺手把比 e 大的向后移动
for (j = i; j > 0 && arr[j - 1] > e; j--) {
arr[j] = arr[j - 1];
}
arr[j] = e;
}
}
EOF