ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基础排序算法-2021-4-1

2021-04-01 17:34:33  阅读:154  来源: 互联网

标签:tmp int 插入排序 排好序 算法 2021 数组 排序


插入排序

简单介绍:

插入排序上最简单的排序之一,它基于这样一个简单的思想,假设输入数组M的长度为N,我们把数组的排序过程视作一个长度为n(n<=N)已经排好序的数组m,往里面不断插入数组M里剩余元素的过程。我们把M里剩余的元素一个一个依次插入到已经排好序的数组m里面,并且每次迭代都保证元素能插入的合适位置,保证更新后的数组m还是排好序的。数组m不断扩容,直到m的长度n=N的时候,这时的数组m就是已经排好序的数组M的结果。

插入排序一般情况下通过N-1趟排序可以得到完全排好序的数组结果。并且通过假设一般情况,用高斯求和可以得到插入排序的平均情形下的时间复杂度为O(N2)。最好情况下的时间复杂度为O(N)。这里假设数组已经是排好序的。

程序实现的关键和难点:

主要是解决如何在每次迭代更新的过程中,让要插入的新元素找到自己合适的位置。这里书上想的方法和我不一样,我想的有点复杂了,就copy书上的了。就很简单,假设排好序的数组上从左到右依次递增的,那就从最末尾的元素M[j]和要插入的元素(设为K)开始比较,如果比要插入的元素值要大,说明这个元素的位置再更新好之后肯定要往后移动一位,毕竟K排好序后肯定会在它的前面。不妨设一般情况为: M[0]...M[j-1],M[j] VS K .

if(M[j] > K)

//说明K肯定要排在M[j]的后面。

M[j+1] = M[j]

M[j] = K 

然后继续比较 if(M[j-1]>K), 也就是if(M[j-1]>M[j]), 如果大于K,说明M[j-1]也要往后移,K的位置还要继续往前移动,所以就有

M[j] = M[j-1] M[j-1] = K

如此循环往复,直到M[i]<=k,也就是M[i]<=M[i+1],说明此时K在i+1这个位置合理,插入元素K找到了自己合适的位置,i+1之前的数组元素不需要做出改变,而i+1之后的已经在每次更新中移动了属于自己的合适位置,此时一趟插入排序结束。而我们设计开始排好序的数组m的初始大小为1,其实就是取首元素。剩余的N-1个依次往m里面插入,总共迭代N-1次,也就是插入N-1个元素,得到最后排好序的数组结果。

代码实现cpp:

void insertion_sort(vector<int>& a)
{
//实现一个插入排序的算法
int len = a.size();
for(int i=1;i<len;i++) {
int tmp = a[i];
for (int j = i; j > 0; j--) {
if (a[j - 1] > a[j])
{
a[j] = a[j - 1];
a[j - 1] = tmp;
//因为首先变化的是a[j]的值,每次tmp都要保存a[j]的值大小
}//如果前一个比当前的要大,就进行值交换,把tmp值不停地迭代更改
}
}
}
程序运行结果:

 

 

 

 

 

 

标签:tmp,int,插入排序,排好序,算法,2021,数组,排序
来源: https://www.cnblogs.com/haomingcoding/p/14607229.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有