排序算法之希尔排序及C++实现

先声明:所有的排序我都会总结记录在博客里,最后会有一个大的cpp文件包含全部排序的代码,每个排序算法放在单独的一个namespace里面,清晰明了,并设计对数器给出测试。我会把它放到网盘供需要之人下载,见这里。 ps:所有的排序以升序为基准。测试编译器为Visual C++

希尔排序:Donald Shell发明,冲破二次时间屏障的第一批排序算法之一。但是,若干年之后才被证明。

希尔排序思想:跟插入排序思想一样,只不过是比较相距一定间隔的元素,间隔距离慢慢减小,直到最后一趟间隔为1(间隔为1就是插入排序)。所以,希尔排序又叫缩减增加排序(diminishing increment sort)。

希尔排序不稳定,也是比较类排序。

希尔排序使用一个序列 h1,h2, …, ht,叫做增量序列。增量序列很多,只需要 h1 为1即可(为1,不就是插入排序,所以插入排序就是增量序列只有一个 h1=1的希尔排序,一个特例而已)。

下面取一张图:很清楚的解释。
shellsort
使用shell增量的代码:

template<typename T>
void shellsort(T* arr, int size) {
    if (size <= 0)
        return;

    for (int k = size / 2; k >= 1; k /= 2) {  // 采用shell增量序列
        for (int i = k; i < size; ++i) {
            T tmp = arr[i];
            int j = i;
            for ( ; j >= k && tmp < arr[j - k]; j -= k) {  // 实际上就是间隔为 K 的插入排序
                arr[j] = arr[j - k];
            }   //最后j位置就是tmp需在的位置
            arr[j] = tmp;
        }
    }
}

还有其他一些出名的增量序列:Hibbard增量、最好的是{1, 5, 19, 41, 109, …}(项为9*4i - 9*2i + 1 或者为 4i - 3*2i + 1)。将其放到数组里很容易实现shellsort算法。

结果:
111
时间复杂度:希尔排序算法简单但分析却极其复杂。但是其性能在实践中完全可以接受,即使对于数以万计的N亦是如此。编程的简单性使得它成为对适度大量数据输入经常采用的算法。
这里截取两个定理:
222
在这里插入图片描述
时间复杂度依增量序列的不同而不同。分析太难了,不用掌握。

纸上得来终觉浅,绝知此事要躬行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值