直接插入排序(C)

直接插入排序

算法描述

  所谓直接插入排序,就是从插入第1个数值开始(存在第0位),直至插入第n个数值(当插入第n个数值时,前面n-1个数值已经是排好序的),插入完第n个数值时排序结束。

假设:数据集合为N, 有n个数据, i = 1 为第1个数值
第一步: 插入N【1】,比较与 N【0】的大小,若N【0】大于N【1】,N【0】后移,N【1】插入到N【0】位置,即: N【0】> N【1】,{ tmp = N【1】;N【1】= N【0】;N【0】= N【1】}
第二步:插入第 i 个数值N【i】,比较与N【i-1】的大小, 若N【i-1】大于N【i】,N【i-1】后移一位,原数值N【i】继续与前面 i-1 个数值依次比较,大于N【i】的后移一位,直至遍历完前面(i-1)个数值或者前面的数值小于原N【i】,将原N【i】插入前(i-1)个位置中的空出位置。
第三步:此排序为顺序排序,即大的向后移位,小的向前插入,当N【i-1】不大于N【i】时,无需进行插入,向后遍历N【i++】即可,直到n结束。

示例代码

结合上面的分析,用C实现一下直接插入排序:

void Insert_Sort(int N[], int length)
{
	int i, j, temp;
	for(i = 1; i < length; i++) {
		if(N[i-1] > N[i]) {
			temp = N[i];	// 临时保存N【i】的数值,以备与前i-1个数值比较
			N[i] = N[i-1];	// 将N【i-1】后移一位
			for(j = i -1; j >= 0 && N[j] > temp; j--) {
				N[j+1] = N[j];	// 将N【j】后移一位
			}
			N[j+1] = temp;	// 将原始N【i】插入,完成一次插入排序
		}
	}
}

测试结果:输入N【10】= {9 ,3, 3,8, 1, 0, 0, 2, 5, 4}
在这里插入图片描述

算法复杂度

空间复杂度:该算法只需要定义一个temp临时变量,因此空间复杂度为 O(1)
时间复杂度:最好情形,该集合已排序,只需遍历比较 n - 1 次,不需要移动元素位置;最坏情形,每次插入N【i】, 需要与前面 i 个记录都比较一次,为 n * (n - 1) / 2 ,在第 i 次排序时,移动记录的次数为 i+1,求和得出时间复杂度为 O(n^2)。
以上为作者本人对于直接插入排序的理解及记录,之后继续总结其他排序算法,加油 ^ _ ^

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caso_卡索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值