排序算法-希尔排序(Shellsort)-C

思路:

希尔排序又称缩小增量排序(diminishing increment sort),

首先选择一个增量序列(increment sequence),h_{1},h_{2},...,h_{t},其中,h_{1}>h_{2}h_{t}=1

按增量序列的个数 t ,执行 t 趟排序;

对于每一趟排序,将h_{t},h_{t}+1,...,N-1 中的每一个位置i,把其上的元素放到i,i-h_{t},i-2h_{t},...中间的正确位置上,可以看出,对于一趟h_{t}增量的排序,就是对h_{t}个独立的子数组执行一次插入排序。

希尔排序一般的增量序列是,h_{1}=N/2,h_{2}=h_{1}/2,....,h_{t}=1

时间复杂度:

平均,O(n^{1.3});最好,O(n) ;最坏 ,O(n^{2})   (取决于选择的增量序列)

程序:

void shell_sort(int array[],int array_size)
{
    int increment,i,j,tmp;
    for(increment=array_size/2;increment>0;increment/=2)
    {   
        for(i=increment;i<array_size;i++)
        {   
            tmp=array[i];
            for(j=i;j-increment>=0 && tmp<array[j-increment];j-=increment)
            {   
                array[j]=array[j-increment];
            }   
            array[j]=tmp;   
        }   
    }   
}
#include <stdio.h>

int main()
{
    int i;  
    int array[]={100,96,88,75,63,52,41,36,28,19,6,0,-19,-105};
    int array_size=sizeof(array)/sizeof(int);
    printf("Original array:\n");
    for(i=0;i<array_size;i++)
        printf(" %d, ",array[i]);
    printf("\n");
    shell_sort(array,array_size);
    printf("Sorted array:\n");
    for(i=0;i<array_size;i++)
        printf(" %d, ",array[i]);
    printf("\n");
    return 0;
}

参考:

https://www.runoob.com/w3cnote/shell-sort.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值