1. 程式人生 > >希爾排序 原理及實現

希爾排序 原理及實現

http://blog...sina...com...cn/s/blog_6d88423901014vai.html 原理

#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;
/*希爾排序的基本思想是:。。。步長係數有優劣
該方法的基本思想是:先將整個待排元素序列分
割成若干個子序列(由相隔某個“增量”的元素組成的)
分別進行直接插入排序,然後依次縮減增量再進行排序,
待整個序列中的元素基本有序(增量足夠小)時,
再對全體元素進行一次直接插入排序。
因為直接插入排序在元素基本有序的情況下(接近最好情況),
效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。。*/
void HillSort(int a[],int n)
{
    int i, j,gap;
    for(int gap=n/2;gap>=1;gap=gap/2)
    {
        for(i=0;i<gap;i++)
        {
            for(j=gap;j<n;j+=gap)
            if(a[j-gap]>a[j])
            {
                //插入排序
                int temp = a[j];
                int k = j - gap;
                while (k >= 0 && a[k] > temp)
                {
                    a[k + gap] = a[k];
                    k -= gap;
                }
                a[k + gap] = temp;
            }
        }
    }
}
int main()
{
    int i,ISource[20];
    srand((unsigned)time(NULL));
    for(i=0;i<20;i++)
        ISource[i]=rand()%100;//產生隨機數
    for(i=0;i<20;i++)
        cout<<ISource[i]<<" ";
        cout<<endl;
        double t1=clock();
        HillSort(ISource,20);
        double t2=clock();
    for(i=0;i<20;i++)
        cout<<ISource[i]<<" ";
        cout<<endl;
}

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

1、插入排序在對幾乎已經排好序的資料操作時,效率高, 即可以達到線性排序的效率

2、對於大規模亂序陣列插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點地從陣列的一端移動到另一端。

希爾排序簡單地改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序。(先將整個大陣列基本有序,再對大陣列來一次插入排序)

思想:使陣列中任意間隔為h的元素都是有序的。這樣的陣列被稱為h有序陣列。在進行排序時,如果h很大,我們就能將元素移動到很遠的地方,為實現更小的h有序創造方便。



我們只需要在插入排序的程式碼中將移動元素的距離改為h即可。這樣,希爾排序的實現就轉化為了一個類似於插入排序但使用不同增量的過程。