希尔排序:按着插入排序的思路,扩大了交换元素的间隔D。
设定一个增量序列:Dk<Dk-1<...<D1=1;对于每Dk个进行Dk间隔排序。
有一个定理:就是在Dk间隔有序的序列,在Dk-1间隔仍然保持有序。
就是每隔Dk个间隔,进行插入排序。
void ShellSort(int a[], int n )
{
int s[5]={5,3,2,1,0};
int d,p,k,tmp,j,i=0;
for(d=s[i];d>0;d=s[++i])//间隔
{
for(p=d;p<n;p++)
{
tmp=a[p];
for(k=p;k>=d&&a[k-d]>tmp;k-=d)
{
a[k]=a[k-d];
}
a[k]=tmp;
}
}
}
以如下为例:
以这个序列为例,
第一轮:间隔为5。tmp=35,由于81>35,所以将35的位置[5]放上81,然后循环结束,将tmp放在81的位置[0]上。然后tmp=17,重复上面过程。得到以下序列:
依次间隔为3
间隔为1,即插入排序,此时也满足了插入排序在序列基本有序时,十分高效,得到以下结果: