希爾排序原理與程式碼實現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];
}