快速排序到底有多快?
上期為大家介紹了快速排序(Quicksort),有很多同學會問:快排是不是比之前幾種排序都要快?它到底有多快?,那就讓我們一起來做個小實驗測試一下吧!
一、實驗設計
目前給大家介紹過了6種排序:冒泡排序、選擇排序、
插入排序、希爾排序、歸并排序、快速排序,并且在上期講快速排續時給出了快排的優化方案:對于大數據集排序先使用快排,當分區達到一定小的時候使用插入排序,有同學就有疑惑:為什么當分區達到一定小時要用插入排序,這樣真的會變快嗎?
1.實驗排序算法
冒泡排序、選擇排序、插入排序、希爾排序、歸并排序、快速排序
2.數據集規模
隨機生成一個數據集,數據個數從10,100,1000依次遞增到10萬個
3.比較方法
比較每個排序算法所用時長,多次測試,減少誤差
4.數據特征
首先對隨機數進行排序,看看哪個排序方法較快;然后再對“基本有序”的數據集排序,再比較這幾種排序方法用時。
二、實驗代碼
使用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 - n1arr = [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))三、實驗結果
時間單位是秒,多次測試結果基本差不多,這里豬哥隨機選取依次測試結果,全場敷冰進行,請勿模仿:
1.隨機數排序結果
n=10
冒泡排序耗時:2.4080276489257812e-05
選擇排序耗時:1.9311904907226562e-05
插入排序耗時:1.5020370483398438e-05
希爾排序耗時:1.5974044799804688e-05
歸并排序耗時:2.8848648071289062e-05
快速排序耗時:1.9073486328125e-05
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
無
四、實驗總結
1.冒泡排序幾乎是最差的排序
我們從兩種數據結果看,冒泡幾乎都是最慢的
2.隨機數排序時,當數據集非常少時,插入類排序 要比 比較類排序 快
我們看到在隨機數排序結果中,只有當n=10時,快排反而比較慢,而插入和希爾排序相對較快,這是因為插入排序和希爾排序都屬于插入類型的排序,而快排和冒泡屬于交換類排序,數據量少時交換所消耗的資源占比大。
3.基本有序數據排序時,在數據量較少的情況下,插入排序勝過其他排序
在基本有序數據排序結果中,當n=10和n=100中都是插入排序消耗時間更短,因為數據基本有序,所以需要插入的次數比較少,盡管插入排序需要一個一個比較,但因為數據量不大,所以比較所消耗的資源占比不會太大。
4.不管數據是隨機還是基本有序,數據量越大,快排的優勢越明顯
快排果然還是名副其實的快,我們看到當數據集達到十萬級別時,冒泡排序已經用時800多秒,而快排只用了0.3秒,相信隨著數據量的增大,它們之間的差距也會越來越大。
5.快排優化方案成立
之前我們講過快排優化方案:對于大數據集排序先使用快排,使數據集達到基本有序,然后當分區達到一定小的時候使用插入排序,因為插入排序對少量的基本有序數據集性能優于快排!
總結
以上是生活随笔為你收集整理的快速排序到底有多快?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法——(2)Python实现十大常
- 下一篇: 超详细Pycharm部署项目视频教程