排序1:直接插入排序

直接插入排序原理很简单

前提:一个随机序列。

思路:从第二个元素开始,每个等待插入元素都要和前面的元素比较。
比较的结果分为两种

若这个元素大于其前一个元素: 则位置保持不变。

这个元素小于前一个元素: 则继续往前找其前前一个元素。

同时要比较该元素和前前个元素的大小。
同样,如果大于则插入在其前前一个元素的后面。
若小于,则继续往前找。

直到 找到一个比带插入元素小的,然后插入到哪个元素后面。

然后接着对将后一个元素作为待插入元素,和前面的元素进行比较,直到遍历完这个列表。

注意:

  • 若这个表本来就是有序递增的,那其实每个元素只需要和他前面的一个元素进行比较就行了,最好的时间复杂度为O(n)。
  • 若这个表中元素顺序是逆序,比如我们想要丛小到大,但是这个表的顺序刚好是丛大到小,那就是最坏的情况,时间复杂度为O(n^2)。

//不使用哨兵的代码
void InsertSort(vector<int> A, int n){
	int i, j, temp;
	for (i = 1; i < n; i++){
		if(A[i]<A[i-1]){//若第i个元素小于第i-1个元素
			temp = A[i];//先把第i个元素的值保存下来,因为接下来要将前面的元素往后移动一个单位,会覆盖第i个元素
			for(j = i - 1; i >= 0 && A[j] > temp; j--)
				A[i+1] = A[j];
				//如果前面的元素还是比第i个元素大,那就继续往前比j--,
				//直到有一个元素小于等于第i个元素(现在已经保存在temp中了)
			A[j+1] = temp;//将第i个元素插入相应位置
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

辛伯达岛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值