排序(希尔排序)

1、希尔排序的简单介绍

希尔排序(shellSo rt)出自D.L.Shell,所以取名shell,是基于直接插入排序一种不稳定的排序方法,又称“缩小增量排序”。
希尔排序的基本思想就是: 将待排序的元素分成若干组,对这些组分别进行直接插入排序,使得所有的分组有序排列,再缩小分组的范围(增量),对缩小后的若干分组继续进行分组插入排序,当范围越来越小,直到为1时,进行最后一次排序,就可以保证所有的元素都有序。
具体的实现过程:
 1.1、确定每次分组的增量,假设现有10个元素,可以将增量设为5,2,1,0
1.2、将每个分组中的元素分别进行排序,设增量为d,分组首元素下标为i,待排序的元素就是i,i+d,i+2d,i+3d……
重复上述1,2步,直到所以的元素有有序,希尔排序的基本流程是:


2、希尔排序C语言的实现

void shellSort(int *arr,int n)
{
    int i,j,k,dk,*delta,key;
    delta=(int *)malloc(sizeof(int)*n/2);
    for(i=0,k=n; k>0; k/=2,i++) //预处理,求出每次划分的增量并保存
        delta[i]=k/2;
    //进行分组插入排序
    for(i=0; delta[i]>0; i++)
    {
        for(dk=k=delta[i]; k<n; k++)
        {
            if(arr[k]<arr[k-dk])
            {
                key=arr[k];
                for(j=k-dk;j>=0&&arr[j]>key;j-=dk)
                    arr[j+dk]=arr[j];
                arr[j+dk]=key;
            }//if
        }//for
    }//for

}

3、希尔排序的效率分析

由上面的图可以看出,shell排序是一种不稳定的排序方法,两个值相同的元素,排序之后,先后顺序发生了改变,虽然排序过程使用了三层循环,但其时间复杂度为O(n^1.3),而整个排序过程,需要一个变量为辅助的转存空间,所以空间复杂度为O(1)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值