【发布时间】: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/Shellsort 和 en.wikipedia.org/wiki/Bubble_sort。但这些都是“渐近复杂度”,实数取决于实现细节,尽管它们倾向于渐近复杂度。 -
重复测量 1000000 个元素。