编程语言
首页 > 编程语言> > 基础排序算法-2021-4-1

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

作者:互联网

插入排序

简单介绍:

插入排序上最简单的排序之一,它基于这样一个简单的思想,假设输入数组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