希尔排序 以及c的实现函数
2012-10-17 16:05
155 查看
由希尔在1959年提出,又称希尔排序(shell排序)。
已知一组无序数据a[1]、a[2]、……a
,需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。
k=n/2;
while(k>0)
{
for(i=k;i<=n;i++)
{
t=a[i];
j=i-k;
while(j>=1 && t<a[j])
{
a[j+k]=a[j];
j=j-k;
}
a[j+k]=t;
}
k/=2;
}
优点:快,数据移动少;
缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,
在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为
O(N*(logN)2), 没有快速排序算法快
O(N*(logN)),因此中等大小规模表现良好,对规模非常大的数据排序不是
最优选择。但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏
的情况下执行的效率会非常差。 专家门提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快, 再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法的一种改进,减少了其复制的次数,速度要快很多。
原因是,当N值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。
当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
原理
已知一组无序数据a[1]、a[2]、……a,需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。
C程序
k=n/2;while(k>0)
{
for(i=k;i<=n;i++)
{
t=a[i];
j=i-k;
while(j>=1 && t<a[j])
{
a[j+k]=a[j];
j=j-k;
}
a[j+k]=t;
}
k/=2;
}
优劣
优点:快,数据移动少;缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,
在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为
O(N*(logN)2), 没有快速排序算法快
O(N*(logN)),因此中等大小规模表现良好,对规模非常大的数据排序不是
最优选择。但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏
的情况下执行的效率会非常差。 专家门提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快, 再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法的一种改进,减少了其复制的次数,速度要快很多。
原因是,当N值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。
当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
相关文章推荐
- for_each,count,mismatch等STL算法在VS2013下的实现以及辅助函数的源码解析
- [置顶] 编写shell脚本以及利用函数实现批量安装Linux服务配置
- 利用FindFirstFile()以及FindNextFile()函数 实现遍历文件夹里的文件
- 在.h文件中写声明,在.cpp文件中写变量和函数,以及实现类的函数
- 虚函数的应用以及实现机制
- 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现
- C++运算符重载(成员函数以及友元函数实现)
- 不定参数函数原理以及实现一个属于自己的printf函数
- 再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main
- 实现字符串拷贝strcpy和memcpy,以及字符串比较函数strcmp
- Lua中实现php的strpos()以及strrpos()函数
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- 用C++实现单链表的基本函数以及增删查改
- 用js进行url编码后用php反解以及用php实现js的escape功能函数
- js中方法重载如何实现?以及函数的参数问题
- C++运算符重载(成员函数以及友元函数实现)
- 【STL】list的简单剖析以及各种函数的实现
- jQuery.API源码深入剖析以及应用实现(1) - 核心函数篇
- PHP的php_strip_whitespace函数描述,以及手册中写的代码压缩函数-可看看函数是怎么实现的
- Spring AOP及MethodInterceptor拦截器实现方法拦截以及切入点函数阻止执行