希尔排序-插入排序算法
2015-11-02 21:18
169 查看
时间复杂度:与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(
![](http://f.hiphotos.baidu.com/baike/s%3D19/sign=aa2de37b8882b90139adc73a728da776/11385343fbf2b211f6c24d12c88065380dd78efa.jpg)
),希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快
O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据不是最优选择。但是比O(
![](http://d.hiphotos.baidu.com/baike/s%3D16/sign=01af9b540ed79123e4e09072ac34c0d3/b812c8fcc3cec3fd372c6c29d488d43f87942758.jpg)
)复杂度的算法快得多。并且希尔排序非常容易实现。希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。
稳定性:不稳定
原址性:是
附加存储空间:一个单位
结构紧密性:移动次数和比较次数减少了
增量序列的选择:希尔排序的运行时间跟所选的增量序列有关系,上面的程序所选的是Sedgewick增量序列,这个增量序列在实践中最为人所称道.它是根据{1, 5, 19, 41, 109...}该序列中的项或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1。这两个式子得来的.这个增列序列在最坏的情况下运行时间为O(N4 /3),平均的情况是O(N7 / 6),还有一种hibbard 增量,它是Hibbard:{1, 3, ..., 2^k-1},这个序列可以在实践和理论上给出更好的结果.
DonaldE.Knuth在他的书中建议到可以选择下面的公式来产生增量序列:设h1 = 1, hi + 1 = 3hi +1,而且当hi - 2 >= N时以hi停止.
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
![](http://f.hiphotos.baidu.com/baike/s%3D19/sign=aa2de37b8882b90139adc73a728da776/11385343fbf2b211f6c24d12c88065380dd78efa.jpg)
),希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快
O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据不是最优选择。但是比O(
![](http://d.hiphotos.baidu.com/baike/s%3D16/sign=01af9b540ed79123e4e09072ac34c0d3/b812c8fcc3cec3fd372c6c29d488d43f87942758.jpg)
)复杂度的算法快得多。并且希尔排序非常容易实现。希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。
稳定性:不稳定
原址性:是
附加存储空间:一个单位
结构紧密性:移动次数和比较次数减少了
增量序列的选择:希尔排序的运行时间跟所选的增量序列有关系,上面的程序所选的是Sedgewick增量序列,这个增量序列在实践中最为人所称道.它是根据{1, 5, 19, 41, 109...}该序列中的项或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1。这两个式子得来的.这个增列序列在最坏的情况下运行时间为O(N4 /3),平均的情况是O(N7 / 6),还有一种hibbard 增量,它是Hibbard:{1, 3, ..., 2^k-1},这个序列可以在实践和理论上给出更好的结果.
DonaldE.Knuth在他的书中建议到可以选择下面的公式来产生增量序列:设h1 = 1, hi + 1 = 3hi +1,而且当hi - 2 >= N时以hi停止.
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
public void ShellSort() { RecType tmp; for (int d = Length / 2; d > 0; d = d / 2) { for (int i = d; i < Length; i ++) { tmp=R [i ]; int j = i-d; while (j >= 0 && R[j].Key < tmp.Key) { R[j + d] = R[j]; j -= d; } R[j + d] = tmp; } } }
#include <iostream> using namespace std; int a[]={70,30,40,10,80,20,90,100,75,60,45}; void ShellSort(int *arr,int length); int main() { cout<<"Before sort:"<<endl; for (int i =0;i <11;i ++) { cout<<a [i ]<<" "; } cout <<endl; ShellSort(a,11); cout<<"After sort:"<<endl; for (int i=0;i <11;i ++) { cout<<a [i ]<<" "; } cout<<endl; system("pause"); } void ShellSort(int *arr,int length) { for (int gap=length/2;gap>0;gap=gap/2) { for (int i =gap;i <length;i ++) { int tmp=arr[i]; int j=i -gap; while (j >=0&&tmp<arr[j]) { arr[j+gap]=arr[j]; j-=gap; } arr[j +gap]=tmp; } } }
相关文章推荐
- c3p0连接数据库
- Android 中如何使用MVP设计模式
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
- 排序算法(一)——简单选择排序
- cocos2d-x笔记(1)
- 强制声明泛型的实际类型
- 装箱和拆箱
- 如何在导航栏的两侧加多个Button
- 开源框架spring AOP的深刻理解
- Spring AOP代理模式
- 避免用char类型作为数组小标
- Objective-C:copy的用法解释
- iOS动画 UIView动画
- 基于MeanShift的视频目标跟踪算法及代码实现
- PowerShell 在hyper-v中创建虚拟机
- Dell笔记本安装win10无法调出cmd
- ADB server didn't ACK fail to start daemon解决方案
- ACE中同步线程方法
- malloc、calloc、realloc的区别
- Linux 的文件权限与目录配置