1、插入排序

插入排序是一种简单的排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法过程包括抽数、比较、后挪和插入四个步骤,其时间复杂度为O(N^2),空间复杂度为O(1),属于稳定排序。
摘要由CSDN通过智能技术生成

插入排序思想(以升序为例):

将后面(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) 

稳定性:稳定

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值