日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速排序到底有多快?

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序到底有多快? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上期為大家介紹了快速排序(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.快排優化方案成立

之前我們講過快排優化方案:對于大數據集排序先使用快排,使數據集達到基本有序,然后當分區達到一定小的時候使用插入排序,因為插入排序對少量的基本有序數據集性能優于快排!

總結

以上是生活随笔為你收集整理的快速排序到底有多快?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。