【经典算法】希尔算法

  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

  希尔排序使用一个序列h1h2,...,ht,叫作增量序列(increment sequence)。只要h1=1,任何增量序列都是可行d,不过,有些增量序列比另外一些增量序列更好。在使用增量hk的一趟排序之后,对于每一个i我们有a[i]<=a[i+hk](这里不等式是有意义的);所有间隔hk的元素都被排序。此时称文件是hk排序的。希尔排序的一个重要性质是,一个hk排序的文件(此后将是hk-1排序的)保持它的hk排序性。事实上,假如情况不是这样的话,那么该算法也没有意义了,因为前面各趟排序的成果会被后面各趟排序的成果会被后面各趟排序给打乱。

  

  hk排序的一般做法是,对于hk,hk+1,..,N-1中的各个位置i,把其上的元素放到i,i-hk,i-2hk,...中间的正确位置上。虽然这并不影响最终结果,但是仔细的观察显示出,一趟hk排序的作用就是对hk个独立的子数组执行一次插入排序。增量序列的一个流行(但是不好)的选择是使用Shell建议的序列:ht=⌊N/2⌋和hk=ht=⌊hk+1/2⌋。

  

代码如下:

复制代码
void ShellSort(int a[], int n) {
    if (a == NULL) return n;

    for (int step = n / 2; step > 0; step /= 2) {
        for (int i = step; i <= n; i++) {
            int temp = a[step];
            int j = i;

            for (; j >= gap && temp < a[j - gap]; j -= gap)
                a[j] = a[j -gap];
            a[j] = temp;
        }
    }
}
复制代码

 

posted @   vincently  阅读(1724)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示