1. 程式人生 > >希爾排序原理與程式碼實現c++

希爾排序原理與程式碼實現c++

希爾排序是直接插入排序的一種,一般直接插入排序適用於基本有序的排序表和資料量不大的排序表。

希爾排序的原理是,先將待排序表分割成若干個步長為dk的子表,舉個例子

下面的無序排列

8 0 4 1 5 3 7 6 2 9

初始的時候dk設定為陣列長度的一半也就是5,那麼第一次排序後可以達到這樣的效果,處於第1個位置的元素比第1+5個位置的元素小,第1+5個元素的位置比第1+10個元素的位置小;處於第2個位置的元素比第2+5個位置的元素小,第2+10個元素的位置比第2+8個元素的位置小(當然到後面長度不夠了)

第一趟排序之後,dk設定為5的一半也就是2,第二趟排序之後還要達到上面類似的效果。

當dk的值變為1時,這時候元素已經基本有序了,相當於進行一次直接插入排序

具體程式碼如下。

#include<bits/stdc++.h>
using namespace std;
int main()
{

    int a[10010];
    int n;
    cin>>n;
    for(int i=1; i<=n; ++i)
    {
        cin>>a[i];
    }
    int j;
    for(int dk=n/2; dk>=1; dk/=2)
    {
        for(int i=dk+1; i<=n; ++i)
        {
            if(a[i]<a[i-dk])
            {
                int t=a[i];
                for(j=i-dk; j>0&&t<a[j]; j-=dk)
                    a[j+dk]=a[j];
                a[j+dk]=t;
            }
        }
    }
    for(int i=1; i<n; ++i)
    {
        cout<<a[i]<<" ";
    }
    cout<<a[n];
}