快速排序到底有多快?

上期爲你們介紹了快速排序(Quicksort),有不少同窗會問:快排是否是比以前幾種排序都要快?它到底有多快?,那就讓咱們一塊兒來作個小實驗測試一下吧!
在這裏插入圖片描述html

1、實驗設計

目前給你們介紹過了6種排序:冒泡排序、選擇排序、
插入排序、希爾排序、歸併排序、快速排序,而且在上期講快速排續時給出了快排的優化方案:對於大數據集排序先使用快排,當分區達到必定小的時候使用插入排序,有同窗就有疑惑:爲何當分區達到必定小時要用插入排序,這樣真的會變快嗎?python

1.實驗排序算法

冒泡排序、選擇排序、插入排序、希爾排序、歸併排序、快速排序算法

2.數據集規模

隨機生成一個數據集,數據個數從10,100,1000依次遞增到10萬個shell

3.比較方法

比較每一個排序算法所用時長,屢次測試,減小偏差緩存

4.數據特徵

首先對隨機數進行排序,看看哪一個排序方法較快;而後再對「基本有序」的數據集排序,再比較這幾種排序方法用時。性能

2、實驗代碼

使用randint隨機生成整數測試

1.隨機數排序

if __name__ == '__main__': # 生成n個0-10萬的隨機整型數據 n = 100000 #n in [10, 100, 1000, 10000, 100000] arr = [randint(0, 100000) for i in range(n)] start1 = time.time() # 使用deepcopy是爲了排除電腦或程序自動優化或使用緩存等因素 bubble_sort(deepcopy(arr)) print("冒泡排序耗時:" + str(time.time() - start1)) start2 = time.time() selection_sort(deepcopy(arr)) print("選擇排序耗時:" + str(time.time() - start2)) start3 = time.time() insertion_sort(deepcopy(arr)) print("插入排序耗時:" + str(time.time() - start3)) start4 = time.time() shell_sort(deepcopy(arr)) print("希爾排序耗時:" + str(time.time() - start4)) start5 = time.time() merge_sort(deepcopy(arr)) print("歸併排序耗時:" + str(time.time() - start5)) start6 = time.time() quick_sort(deepcopy(arr)) print("快速排序耗時:" + str(time.time()-start6)) 

2.基本有序數據排序

數據集生成的基本思路:先生成一個有序數列,而後將少許數據插入有序數列中,這裏取0.1*n個亂序插入到0.9*n個有序數列中。大數據

if __name__ == '__main__': # 生成n個0-10萬的基本有序的整型數據 n = 10 # n in [10, 100, 1000, 10000, 100000] n1 = int(n * 0.9) n2 = n - n1 arr = [i for i in range(n1)] for i in range(n1, n): arr.insert(randint(0, n1 - 1), i) start1 = time.time() bubble_sort(deepcopy(arr)) print("冒泡排序耗時:" + str(time.time() - start1)) start2 = time.time() selection_sort(deepcopy(arr)) print("選擇排序耗時:" + str(time.time() - start2)) start3 = time.time() insertion_sort(deepcopy(arr)) print("插入排序耗時:" + str(time.time() - start3)) start4 = time.time() shell_sort(deepcopy(arr)) print("希爾排序耗時:" + str(time.time() - start4)) start5 = time.time() merge_sort(deepcopy(arr)) print("歸併排序耗時:" + str(time.time() - start5)) start6 = time.time() quick_sort(deepcopy(arr)) print("快速排序耗時:" + str(time.time() - start6)) 

3、實驗結果

時間單位是秒,屢次測試結果基本差很少,這裏豬哥隨機選取依次測試結果,全場敷冰進行,請勿模仿:優化

1.隨機數排序結果

n=10

冒泡排序耗時:2.4080276489257812e-05
選擇排序耗時:1.9311904907226562e-05
插入排序耗時:1.5020370483398438e-05
希爾排序耗時:1.5974044799804688e-05
歸併排序耗時:2.8848648071289062e-05
快速排序耗時:1.9073486328125e-05ui

n=100

冒泡排序耗時:0.000782012939453125
選擇排序耗時:0.0004570484161376953
插入排序耗時:0.00039076805114746094
希爾排序耗時:0.00018095970153808594
歸併排序耗時:0.0003409385681152344
快速排序耗時:0.00017905235290527344

n=1000

冒泡排序耗時:0.08327889442443848
選擇排序耗時:0.03776884078979492
插入排序耗時:0.04986977577209473
希爾排序耗時:0.0034036636352539062
歸併排序耗時:0.005920886993408203
快速排序耗時:0.0021750926971435547

n=10000

冒泡排序耗時:8.781844854354858
選擇排序耗時:3.438148021697998
插入排序耗時:4.186453819274902
希爾排序耗時:0.05663800239562988
歸併排序耗時:0.06386470794677734
快速排序耗時:0.02335190773010254

n=100000

冒泡排序耗時:900.5480690002441
選擇排序耗時:879.1669909954071
插入排序耗時:428.66180515289307
希爾排序耗時:0.967015266418457
歸併排序耗時:1.4872560501098633
快速排序耗時:0.3050980567932129

n=1000000

再通過幾小時等待後,我彷彿聞到一股燒焦的味道,真香~
在這裏插入圖片描述

2.基本有序數據排序結果

n=10

冒泡排序耗時:2.288818359375e-05
選擇排序耗時:1.9788742065429688e-05
插入排序耗時:1.3113021850585938e-05
希爾排序耗時:1.5974044799804688e-05
歸併排序耗時:2.9087066650390625e-05
快速排序耗時:1.811981201171875e-05

n=100

冒泡排序耗時:0.0004851818084716797
選擇排序耗時:0.0004131793975830078
插入排序耗時:0.00013065338134765625
希爾排序耗時:0.00015997886657714844
歸併排序耗時:0.00032019615173339844
快速排序耗時:0.00015974044799804688

n=1000

冒泡排序耗時:0.05040717124938965
選擇排序耗時:0.03394508361816406
插入排序耗時:0.009570121765136719
希爾排序耗時:0.0029370784759521484
歸併排序耗時:0.005821943283081055
快速排序耗時:0.0022530555725097656

n=10000

冒泡排序耗時:5.24026083946228
選擇排序耗時:3.340329885482788
插入排序耗時:0.8101489543914795
希爾排序耗時:0.04622912406921387
歸併排序耗時:0.05988883972167969
快速排序耗時:0.023930788040161133

n=100000

4、實驗總結

1.冒泡排序幾乎是最差的排序

咱們從兩種數據結果看,冒泡幾乎都是最慢的

2.隨機數排序時,當數據集很是少時,插入類排序 要比 比較類排序 快

咱們看到在隨機數排序結果中,只有當n=10時,快排反而比較慢,而插入和希爾排序相對較快,這是由於插入排序和希爾排序都屬於插入類型的排序,而快排和冒泡屬於交換類排序,數據量少時交換所消耗的資源佔比大。
排序分類

3.基本有序數據排序時,在數據量較少的狀況下,插入排序賽過其餘排序

在基本有序數據排序結果中,當n=10和n=100中都是插入排序消耗時間更短,由於數據基本有序,因此須要插入的次數比較少,儘管插入排序須要一個一個比較,但由於數據量不大,因此比較所消耗的資源佔比不會太大。

4.無論數據是隨機仍是基本有序,數據量越大,快排的優點越明顯

快排果真仍是名副其實的快,咱們看到當數據集達到十萬級別時,冒泡排序已經用時800多秒,而快排只用了0.3秒,相信隨着數據量的增大,它們之間的差距也會愈來愈大。

5.快排優化方案成立

以前咱們講過快排優化方案:對於大數據集排序先使用快排,使數據集達到基本有序,而後當分區達到必定小的時候使用插入排序,由於插入排序對少許的基本有序數據集性能優於快排!

相關文章
相關標籤/搜索