希尔排序是直接插入排序的一种,一般直接插入排序适用于基本有序的排序表和数据量不大的排序表。
希尔排序的原理是,先将待排序表分割成若干个步长为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];
}