文章目录
插入算法介绍
插入算法应该算得上是最容易理解的算法了,只要是玩过扑克牌的人一眼就能看懂插入排序的思想。
通俗来说就是我有6,7,9,10这四张牌,然后我摸到一张 8 ,最自然也是最简单的方法就是在已经有序的四张牌里面找到 8 应该插入的位置,也就是 7 和 9 之间,然后把 8 插入进去。
插入排序的思想就是这么的简单,一个一个地把元素插入到合适的位置,直到所有元素都有序为止。
动图演示
动图来源网络
代码实现
void InsertSort(int* a, int n) {
//for循环不断维护有序区
for (int i = 0; i < n - 1; ++i) {
//end是有序区的末尾
int end = i;
//tmp储存有序区间的下一个元素,即是要插入的元素
int tmp = a[end + 1];
while (end >= 0) {
//不断while直到找到比tmp大的元素
if (tmp < a[end]) {
//当前end元素比tmp大,则要复制end到下一个位置
a[end + 1] = a[end];
//更新end位置,进行下个循环的比较
--end;
}
else {
//找到比tmp大的元素跳出循环
break;
}
}
//将暂存的tmp赋值到end+1的位置
a[end + 1] = tmp;
}
}
插入排序要进行 n-1 轮, 每一轮在最坏的情况下的比较次数分别是 1 次、 2次、 3 次······一直到 n-1 次,所有最坏的时间复杂度是 O(n2) 。
至于空间复杂度,由于插入排序是原地排序,并没有借助额外的储存空间,所以空间复杂度是 O(1) 。