排序算法:直接插入排序

直接插入排序基本思路
对于给定的一组记录,初始时假定第一个数是有序序列,其余的按照无序序列;接着从第二个数开始,按照大小插入到之前的有序序列中,直到最后一个数插入到有序序列为止。

图示:
在这里插入图片描述
先假定29这个数是个有序序列,从18往后都是无序的。
这样先用18与29比较(18与有序序列的最后一个数比较),比29小,则先让29后移一位,移到18的位置,再把18移到29的位置,这样前两个就排序完毕。
我们直接跳到第四次比较,有代表性。3先和87比较,比他小,就先把3存起来,87后移一位,接着3和87的前一个数比较,还是小,56也后移一位;再和29比较,还是小;直到与18比完还是小,依旧18后移一位,把3插入到原来18的位置。
如此往后,排序完成。

可以借助下面动态图帮助理解在这里插入图片描述
动态图来自这位博主

分析完毕,接下来上代码

#include <stdio.h>
void InsertSort(int *array, int length)
{
	int i, j, t;
	for(i = 1; i < length; i++)  //从第二个数开始
	{
		t = array[i];         //先把array[i]存起来
		for(j = i - 1; j >= 0; j--)    
		{
			if(array[j] > t)
			{
				array[j + 1] = array[j];  //往后移一个
			}
			else
			{
				break;        //如果if不成立。直接跳出本次for循环
			}
		}
		array[j + 1] = t;   //由于最后一次j循环自减了一次,所以要加一恢复到最后一个j位置。
	}
}

int main()
{
	int array[6] = {29,18,87,56,3,27};
	int i,length;
	length = sizeof(array)/sizeof(array[0]);
	InsertSort(array, length);

	for(i = 0; i < length; i++)
	{
		printf("%d ", array[i]
	}
	printf("\n");
	return 0;
}

稳 定 性:稳定

时间复杂度: O(n^2)
(1)初始数据正序,总比较次数:n-1
(2)初始数据逆序,总比较次数:(n2+n-1)/2= O(n2)
(3)初始数据无序,第i趟平均比较次数(i+1)/2,总次数为:(n2+3n)/4=O(n2)
(4)可见,原始数据越趋向正序,比较次数和移动次数越少。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值