插入排序思想(以升序为例):
将后面(tmp)的数“提出”从右向左依次比较数据大小若tmp比该位置的数值小,则将该数据向后移动,若大则插入该位置
可理解为一个数要插入一个有顺序的数组中,进行比较,放入适合的位置,如同玩扑克牌将其顺序排齐
通过循环不断由大问题转化为小问题(先排前两个数,再排前三个数,再排前四个数......)
以排前两个数为例,先解决子问题
//以升序为例
int end = 0; //要插入数相邻的数
int tmp = a[1]; //要插入的数
while (end >= 0)
{
if (a[end] > tmp) //若该数据比tmp大,则将该数据向后挪
{
a[end + 1] = a[end];
end--; //然后和左边的数继续比较
}
else
{
break;
}
a[end + 1] = tmp; //end位置总在要插入的位置的左边
子问题解决后,我们可以通过循环来实现整排序,首先对前两个数进行排序,排完后进行前三个数排序......直到把所有数据排完。
简单来说:1、抽数(后面的“新”数)
2、比较
3、后挪(不一定执行,但一定写)
4、插入
代码如下:
void InsertSort(int* a, int n)
{
int i = 0;
for (i = 1; i < n; i++)
{
int end = i - 1;
int tmp = a[i];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定