[C语言][排序(2)]希尔排序

希尔排序:按着插入排序的思路,扩大了交换元素的间隔D。

设定一个增量序列: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=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,即插入排序,此时也满足了插入排序在序列基本有序时,十分高效,得到以下结果:

 

 

你可能感兴趣的:(C++程序设计)