插⼊排序(Insertion Sort)类似于玩扑克牌插牌过程,每次将⼀个待排序的元素按照其关键字⼤⼩插⼊到前⾯已排好序的序列中,按照该种⽅式将所有元素全部插⼊完成即可

算法思想:
把待排序元素插入到已排序的序列中。想象一下一张一张整理扑克牌的过程。

- 把前面比我大的统一向后移动,移动到不能在移动的时候,把数放的空出来的格子就可以了
代码:
测试排序:P1177 【模板】排序 - 洛谷
#include <iostream>
using namespace std;const int N = 1e5 + 10;int n;
int a[N];void insert_sort()
{// 依次枚举待排序的元素for (int i = 2; i <= n; ++i) //第一个位置默认就是有序的{//必须要把a这个位置提前保存一下,因为是把i位置前面比我大的数统一右移//如果i-1这个位置就比我大,i-1这个位置就会右移//右移之后就会把a[i]这个数覆盖掉,所以我们要提前把a这个数保存int k = a[i];//前面比k大统一右移int j = i - 1;while (j >= 1 && a[j] > k) //当前面还有元素且前一个数比当前数大{a[j + 1] = a[j];--j;}//程序执行到这,j位置的值小于等于k,空位置在j+1a[j + 1] = k;}
}int main()
{cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];insert_sort();for (int i = 1; i <= n; ++i) cout << a[i] << " ";cout << '\n';return 0;
}
时间复杂度
- 当整个序列有序的时候,插⼊排序最优,此时时间复杂度为 O(n) ;比如升序12345,仅需从前往后扫描数组一遍就结束了;
- 当整个序列逆序的时候,每个元素都要跑到最前⾯,时间复杂度为 O(n*n);比如54321,拿4和前面的5作比较,5要向后移动1位,移动了1次,接下来3和前面的数比较的时候,前面的数要移动2次,到2,前面的数要移动3次,到1,前面的数要移动4次,数据范围是5要执行1+2+3+4次,如果数据范围是n就要执行1+2+…+n-1次,是个等差数列求和,总体求和完是N方级别的,我们考虑算法的时候,每次考虑都是最差情况,因此它的时间复杂度就是O(N*N)