我尝试使用两种排序算法对列表进行排序:bubble和quick
为此,我分别使用algorithms
模块和bubble_sort
,quick_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
为什么在这种情况下冒泡排序比快速排序更快?
答案 0 :(得分:2)
复杂性告诉你哪一个是n
的最大值。我猜n=9
太小了,所以在这种情况下,隐藏在O()中的常量的效果比n^2
和n 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)