插入排序c语言_排序之插入排序

596e7050908d195d116625fc9e41efc8.png

插入排序思想:减治法。

这个思想大致就是把一个大问题划分为许多同等规模的小问题,然后利用小问题解得到整个问题解。

假设要对一个a[0……n]的数组进行排序,假设a[0……n-1]是有序的,只需要把第a[n]个插入到a[0……n-1]合适的位置,从右往左扫描a[0……n-1]直到遇到第一个小于等于a[n]的位置为止就将a[n]插入其后。

减治法在插入排序里体现就是假设a[0]是有序的,然后比较a[0] a[1],将a[1]插入前面正确位置,然后a[0……1]是正序的,找到a[2]在a[0……1]里正确的位置,以此类推到a[0……n]

半伪代码:

0 insertionSort(int a[0……n-1])
1 {
2    int i,j,v;
3    for(i=1;i<=n-1;i++)
4    {
5       v=a[i];//当前要被插入的值
6       j=i-1;//
7       while(j>=0&&a[j]>v)//如果前面的大于v则元素值一直后移腾出位置
8       {
9          a[j+1]=a[j];
10         j--;
11       }
12        a[j+1]=v;//插入正确的位置
13    }
14 }

其实按照它的算法思想,这个代码还有很多别的实现方式,比如7-12行主要完成的就是在有序序列不断比较找到v正确的位置,它用的都是数据移动没有明显交换。我写过用交换的但是很麻烦代码行数多还没有这个简洁。

你们可以和下面这个比较一下,算算时间效率。下面是真的伪码。。

InsertSort(a[0……n-1])
{
   for i<-1 to n-1 do
   j=i-1;
   while j>=0anda[j]>a[j+1]do
   swap(a[j],a[j+1]);
   j--;
}

至于它的算法时间复杂度 空间复杂度分析暂时不是这本书分析重点随便说说……

比较好的情况下是输入的是有序序列那时间复杂度就是O(N),平均情况下还是o(n^2).

以上参考:《算法设计与分析基础》第三版P103

《数据结构与算法分析C语言描述》P180

如果不小心误人子弟了,概不负责。仅仅个人记录所学。排版这么丑怪知乎,没有五颜六色怪知乎,你没有看懂怪你自己。欢迎讨论,不能说我0-0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值