希尔排序

来源:互联网 发布:网络非法赌博投诉电话 编辑:程序博客网 时间:2024/06/03 13:35

希尔排序介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

直接插入排序算法简单,在n 值较小时,效率比较高,在n 值很大时,若序列按关键码基本有序,效率依然较高,其时间效率可提高到O(n)。希尔排序即是从这两点出发,给出插入排序的改进方法。

希尔排序实质上是一种分组插入方法。
它的基本思想是: 先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,再对全体记录进行一次直接插入排序,就可以完成整个的排序工作。

希尔排序方法

  1. 选择一个gap(增量)序列,分别根据每一个gap将数据分组;
  2. 对于某一个gap下的几组数据按照直接插入排序;
  3. 完成一趟排序后,每一个组的元素都是有序的。然后减小gap的值,并重复执行第二步.

图解:

这里写图片描述


代码

void ShellSort(int v[],int n){    int gap,i,j,temp;    for (gap = n/2; gap > 0; gap /= 2)  //对数据进行分组    {        for(i = gap; i < n; i++)        //对每一组数据进行处理        {            /*交换v[j]>,[j+gap]时 新的v[j]和v[j-gap]要重新比较*/            for(j = i-gap; j>=0 && v[j]>v[j+gap]; j -= gap)             {                temp = v[j];                v[j] = v[j+gap];                v[j+gap] = temp;            }          }    }}

希尔排序特点

增量序列取法: 无除1以外的公因子,最后一个增量值必须为1.

  1. 子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列
  2. 希尔排序可提高排序速度,因为
    1).分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体上看是减小了
    2).关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序

效率分析

希尔排序时效分析很难,在理论上还有待进一步研究 一般认为:希尔排序的时间复杂度在O(nlog2n)和 O(n2)之间,大致为O(n1.3).
关键码的比较次数与记录移动次数依赖于步长因子序列的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的步长因子序列的方法。步长因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:步长因子中除1 外没有公因子,且最后一个步长因子必须为1。希尔排序方法是一个不稳定的排序方法。


友情链接:直接插入排序 希尔排序

原创粉丝点击