排序学习笔记(1) - 插入排序

 学习排序,参考代码、测试程序:
http://tech.ddvip.com/2006-12/116513859112852.html
表示一下感谢~~


1. 插入排序:
1)直接插入排序
稳定排序,性能:O(n^2);

2)二分查找插入(折半插入排序)
这个算法也是非常被大众使用的,折半、二分已经深入人心了。不过它的数据后移却给这个算法拖了后腿。
不过没关系,我们能够从中得到解决问题的思想:折半!
稳定排序,性能:O(n*lg(n));

 

3)shell排序
思想:
也叫缩小增量排序。取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。在开始的时候,每个子序列里关键码很少,直插的效率很高;随着间隔的缩小,子序列的关键码越来越多,但是在前面的排序基础上,关键码已经基本有序,直插的效率依然很高。

换个我自己的说法。k是间隔gap,k的初值一般是size/3+1。第i、i+k、i+2k、i+mk作为一组,进行直插排序;同样的,i+1、i+1+k、i+1+2k、i+1+mk也是。以k=k/3+1的速度,逐渐缩小k的值,直到k=1,再排一次,结束。

 

实现:
这个版本(上面的链接)的实现要比殷版的清晰,但是殷版的do套着for再套着do,实在看中费劲。当然,您这gap好像也不应该做成n/2。

具体实现是3个for循环:
for k=size/3+1-->1(++)   //缩小增量
  for i=k-->n(++)        //遍历,一次小排序
    for j=mk-->gap(--)   //回溯,或者说,是一次小型的插入排序

 

不稳定排序,性能:n^1.25-->1.6*n^1.25;
适用范围:代码简单,大数小数效率都不错;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值