为什么冒泡排序比快速排序更快

时间:2017-10-17 09:00:36

标签: python algorithm python-3.x

我尝试使用两种排序算法对列表进行排序:bubble和quick 为此,我分别使用algorithms模块和bubble_sortquick_sort。据我所知,第一算法的复杂度为n^2,第二算法为n*log(n)。但是我从这段代码得到了意想不到的输出:

from algorithms.sorting import bubble_sort, quick_sort
import time

my_list = [1, 12, 33, 14, 52, 16, 71, 18, 94]
start1 = time.time()
for i in range(1000000):
    bubble_sort.sort(my_list)

end1 = time.time()
start2 = time.time()
for i in range(1000000):
    quick_sort.sort(my_list)

end2 = time.time()

print('Bubble sort:', end1 - start1)
print('Quick sort:',end2 - start2)

输出:

>>> Bubble sort: 7.04760217666626
>>> Quick sort: 8.181402921676636

为什么在这种情况下冒泡排序比快速排序更快?

5 个答案:

答案 0 :(得分:2)

复杂性告诉你哪一个是n的最大值。我猜n=9太小了,所以在这种情况下,隐藏在O()中的常量的效果比n^2n log(n)之间的差异更重要。我建议你重试my_list=range(1000)

此外,您必须从随机排序的列表开始。否则(使用标准实现),在已排序的情况下,冒泡排序为O(n)(最终只是验证列表已经排序)

答案 1 :(得分:1)

对于所有n> = 1,数学上n ^ 2大于nlog(n)。

因此,对于n = 9(来自示例),冒泡排序{O(n ^ 2)}应该比快速排序{O(nlog n)}慢。

但实际的复杂性是:

Big-O冒泡排序:n(n-1),相当于 O(n ^ 2)

Big-O快速排序:O(n(log n))

但由于n = 9非常小, n ^ 2和n具有可比性且假设n ^ 2-n等于n变得错误

至于证据:

对于n = 9,

n ^ 2-n是7.2

对于n = 9,

n(log n)是8.5 这与问题中提到的相同。

答案 2 :(得分:0)

快速排序的最差情况是O(n^2)。最坏的情况取决于枢轴选择策略,通常它发生在已经排序的数组(你的数组是)。

此外,对于小型数据集,冒泡排序或其他简单排序算法通常比更复杂的算法更快。原因是,对于每次迭代,简单算法的计算量都比复杂算法少。

例如,假设冒泡排序每次迭代需要3ms,而快速排序需要20ms。因此对于包含10项的数组。

在这种情况下,冒泡排序需要10*10*3 = 300ms

快速排序需要10*log2(10)*20 = 664ms

因此,泡泡排序更快。但是,随着更大的数据集的采用,由于运行时间复杂性降低,快速排序变得越来越高效。

答案 3 :(得分:0)

那么最糟糕的运行时间是什么?

Quicksort:n^2和 Bubblesort:n^2

请记住,最糟糕的情况并不总是衡量现实世界表现的良好指标。在一般情况下,

Quicksort:nlog(n)

Bubblesort:n^2

基于此,Quicksort比Bubblesort更快。

然而,Quicksort处理退化的情况很差。当列表已经按照几乎排序的顺序时,Quicksort将继续递归。 Bubblesort将在完成后立即停止,在这种情况下使Bubblesort更快。

答案 4 :(得分:0)

首先,尝试对更大的数组进行排序,以便二次复杂度优先于对数复杂度。
注意:关于对数复杂度,请注意 log(n) quicksort ,不是 log < sub> 10 ,它的 log 2 - &gt; O(n)应表示为 n * lg(n)

其次,没有理由对已排序的数组进行排序 ...试试这个:

import numpy as np
arr = np.linspace(-1e3, 1e3, 1e5)
np.random.shuffle(arr)  # Shuffling array preserving the content

如果算法不接受numpy数组,请将其转换为list:
arr_l = list(arr)