【问题标题】:Shell sort only 3 times faster than Bubble sort?Shell排序仅比冒泡排序快3倍?
【发布时间】:2016-07-23 09:14:55
【问题描述】:

我在 C 中实现了 Shell 排序,它只比冒泡排序快 3 倍。 这是我的排序持续时间(以秒为单位):

For list of 100 integers:
BubbleSort: 0.000333
ShakeSort: 0.000282
QuickSort: 0.000048
QuickSort_Iter: 0.000063
InsertionSort: 0.000188
ShellSort: 0.000150

For list of 1000 integers:
BubbleSort: 0.028191
ShakeSort: 0.019354
QuickSort: 0.000435
QuickSort_Iter: 0.000528
InsertionSort: 0.011917
ShellSort: 0.003664

For list of 5000 integers:
BubbleSort: 0.241116
ShakeSort: 0.222127
QuickSort: 0.001306
QuickSort_Iter: 0.001592
InsertionSort: 0.151656
ShellSort: 0.091002

For list of 10000 integers:
BubbleSort: 0.959580
ShakeSort: 0.872648
QuickSort: 0.002877
QuickSort_Iter: 0.003379
InsertionSort: 0.601329
ShellSort: 0.350866

这是正常的还是我的实现可能有问题?

【问题讨论】:

  • 这很大程度上取决于您的数据集
  • 它是基于数组的伪随机整数 0-999 向量。我只是想知道在任何情况下,Shell 排序的性能是否合理
  • 不存在“任何”条件。条件真的很重要......假设你有一个完全排序的数字数组,除了第一个和最后一个被交换的数组:在这种情况下,shell 排序可能比冒泡排序更快(因为它可以进行一次交换,而冒泡排序必须交换所有数字)......但这只是一种极端情况:这并不意味着冒泡排序比壳排序慢或快,它只意味着对于那个特定的数据集。大 O 中的 n 很重要 :-)
  • 算法不是“快3倍”。冒泡排序具有O(n)O(n*n) 的复杂度,而外壳排序具有O(n*log n)O(n*log n*log n) 的复杂度。请参阅 en.wikipedia.org/wiki/Shellsorten.wikipedia.org/wiki/Bubble_sort。但这些都是“渐近复杂度”,实数取决于实现细节,尽管它们倾向于渐近复杂度。
  • 重复测量 1000000 个元素。

标签: c shellsort


【解决方案1】:

我有一个排序基准测试程序,内置了 4 个 shell 排序和冒泡排序变体。四个变体中的三个具有相似的计时属性;第四个比其他三个差得多。但是,当排序大小为 1000 时,3 个 shell 排序花费的时间不到 100µs,而慢速排序花费的时间不到 600µs,冒泡排序花费的时间不到 900µs,但大小为 10,000 时,时间在 1-2ms、70ms 和 142ms 之间变化,在大小为 100,000 的情况下,时间在 14-30 毫秒、8.6 秒和 18 秒之间变化。因此,其中一种 shell 排序的速度大约是冒泡排序的一半,但其他的要好得多。 ——乔纳森·莱弗勒

好的,我更改了实现,在 Shell 排序期间使用插入排序逻辑对子向量进行排序,所以现在它按预期执行 - LynnXe

【讨论】:

    【解决方案2】:

    我会说这是您的实施的“问题”。

    shellsort 的棘手之处在于,对于要排序的给定 n 值序列,有一组间隙将导致 shellsort - 对于一般情况 - 优于所有其他间隙集 - 或标准算法那件事*。不太好的差距会导致表现不佳甚至糟糕。

    来自 Knuth、Sedgewick、Ciura 和其他人的序列并不是那么好,但让我们面对现实吧,考虑到我们对算法的秘密知之甚少,找到给定 n 的最佳间隙集是一项艰巨的任务。

    正如我写的关于here 的那样,评估一组差距以找到最佳差距是很棘手的(尤其是对于大型值集)。

    • 针对 n 的值集进行测试

    ___________________ 编辑 ___________________

    我建议您尝试以下 n=100 的间隙:{99,60,16,4,1},我认为这将改善您的 100 整数 shellsort 结果。

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2017-03-18
      • 2011-11-30
      • 2012-05-12
      • 2019-02-26
      • 2012-08-26
      • 2021-11-24
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多