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

希尔排序:按着插入排序的思路,扩大了交换元素的间隔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,即插入排序,此时也满足了插入排序在序列基本有序时,十分高效,得到以下结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值