排序--ShellSort 希尔排序

  希尔排序 no 实现

  希尔排序其实就是插入排序。只不过希尔排序在比较的元素的间隔不是1。 我们知道插入排序 都是 一个一个和之前的元素比较。发现比之前元素小就交换位置。但是希尔排序可能是和前第n个元素比较,如果发现比前第n个元素小就和前第n个元素交换位置。具体看下图

    

  第一趟比较。n是为5。也就是说每个数和前面第5个数比较。如果发现小于前面第5个数的话。交换位置。

  所以我们看到 72 比 592 小。 所以交换位置。 283 比 348 小。继续交换

  第二趟比较。 n 是2。同理

  最后一次比较。n是1 ,注意这个时候就是插入排序了。

  这个 5 2 1 这种增量数字的选择到底是基于什么来选择的。其实我也不知道,一般的数字都可以,只不过性能不一定那么快。还有比如说4 排序了。 2 再排序的话 性能就会差一些。因为相对于4已经排序了的数组。已经有一部分的数组已经排好序了。

  这里给出几个比较快的 排序增量的sequence

  

    //Sedgewick 增量序列的最坏时间复杂度为 O(N4/3);平均时间复杂度约为 O(N7/6)。
    //hi=max(9∗4^n−9∗2^n+1, 2^(n + 2) * (2^(n + 2) - 3)) + 1
    //5 是由N = 0 得出来的
    //28
    private static int INCREMENT_SEQUENCE_SEDGEWICK[] = {
            1,5,19,41,109,209,505,929,
            2161,3905,8929,16001,36289,64769,146305,260609,
            587521,1045505,2354689,4188161,9427969,16764929,37730305,67084289,
            150958081,268386305,603906049,1073643521};
INCREMENT_SEQUENCE_SEDGEWICK

 

    //Knuth  sequence 3N + 1 , N 是之前的元素
    //O(n^1.5)
    //20
    int INCREMENT_SEQUENCE_KNUTH[] = {
            1,4,13,40,121,364,1093,3280,
            9841,29524,88573,265720,797161,2391484,7174453,21523360,
            64570081,193710244,581130733,1743392200};
INCREMENT_SEQUENCE_KNUTH

 

  具体的实现可以在这里看到 ->>>>>>https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/ShellSort.java

  这里还有关于什么shell排序很快的原因https://www.zhihu.com/question/24637339

  Sedgewick 增量序列的ShellSort 最坏时间复杂度为 O(N4/3);平均时间复杂度约为 O(N7/6)

转载于:https://www.cnblogs.com/robsann/p/7528556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你解答关于希尔排序的问题。希尔排序是插入排序的一种改进算法,也被称为“缩小增量排序”。它的基本思想是将待排序的序按照一定的间隔分成若干个子序,对每个子序进行插入排序,然后逐步缩小间隔,直到间隔为1,最后对整个序进行一次插入排序希尔排序的时间复杂度与间隔序的选择有关,最坏时间复杂度为$O(n^2)$,平均时间复杂度为$O(n \log n)$。相比于插入排序希尔排序的时间复杂度有了明显的提升,且其在实际应用中也表现得比插入排序好。 下面是希尔排序的示例代码: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 在这段代码中,我们首先定义了一个希尔排序的函数shell_sort,它接收一个表arr作为参数,并返回排好序的表。在函数中,我们首先获取表的长度n和初始的间隔gap,然后开始循环,直到间隔为1为止。在每次循环中,我们将表按照间隔分成若干个子序,对每个子序进行插入排序,将子序按照升序排。最后,我们将间隔除以2,继续循环直到间隔为1。 使用希尔排序表进行排序非常简单,只需要调用shell_sort函数即可。例如,我们可以这样调用函数: ```python arr = [5, 2, 8, 3, 1, 6] sorted_arr = shell_sort(arr) print(sorted_arr) ``` 这段代码会输出排好序的表[1, 2, 3, 5, 6, 8]。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值