日韩性视频-久久久蜜桃-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.快排優化方案成立

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

總結

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

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

主站蜘蛛池模板: 日韩在线观看网址 | 久久99精品国产麻豆婷婷洗澡 | 花房姑娘免费观看全集 | 日本成人动漫在线观看 | 久久精品国产亚洲AV无码男同 | 久久福利精品 | xxxxx毛片 | 成人毛片观看 | 日本少妇喷水视频 | 国产综合精品久久久久成人影 | 精品深夜av无码一区二区老年 | 深夜精品视频 | 中文字字幕在线中文乱码 | 天天综合网在线 | 美女av片 | 国产精品第一页在线观看 | 你操综合 | 亚洲精品视频三区 | 最新中文字幕在线观看 | 在线无码va中文字幕无码 | 脱女学生小内内摸了高潮 | 日本爱爱网址 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 性――交――性――乱睡觉 | 三级在线网站 | 黄色片免费 | 久久波多野结衣 | 看黄色的网址 | 国产黄色片在线观看 | 欧美99视频| 欧洲一级片 | 午夜福利视频合集1000 | 福利社午夜影院 | 少妇无内裤下蹲露大唇视频 | 校园sm主奴调教1v1罚视频 | 日韩欧美大陆 | 牛牛影视一区二区三区 | 日本一区视频在线 | 黄色网在线 | 国产97色在线 | 国产 | 最新地址av | 午夜九九 | 国产精品第二十页 | 97人妻人人揉人人躁人人 | 国产97在线 | 亚洲 | 黄色小说在线观看视频 | 国产视频一二三区 | av在线毛片 | 成人勉费视频 | 91免费视频国产 | 亚洲 欧美 国产 另类 | 91网站免费| 亚洲第一av网站 | 丰满少妇被猛烈进入高清播放 | 成人免费视频观看 | 性做久久久久久久免费看 | 在线免费黄网 | 国际av在线| 亚洲欧美激情另类校园 | 亚洲欧美一区在线 | 久久av影视 | 狠狠澡| 国产又粗又猛又爽又黄的视频在线观看动漫 | 成年人国产视频 | 欧美成人一区二区 | 日韩乱码一区二区 | 色偷偷91 | 99久久久久久久久 | 欧美性教育视频 | 视频1区 | 草草久久久无码国产专区 | 五月激情婷婷在线 | www.一区二区三区四区 | 免费a v视频| 欧美日韩人妻精品一区 | 冲田杏梨av | 日韩高清网站 | 欧美人妻精品一区二区免费看 | 伊人久久大香线蕉av一区 | 男女靠逼视频 | av久久久久久 | 韩国三级hd中文字幕 | 亚洲成人精品av | 欧美韩日一区二区 | 91在线观看免费高清 | a在线 | 在线观看黄色小视频 | 插插看看 | 很很干很很日 | 高潮一区二区三区乱码 | 丰满少妇熟乱xxxxx视频 | 特级西西444www高清大胆免费看 | 爱情岛论坛亚洲品质自拍 | 亚洲精品久久久中文字幕 | 欧美丰满熟妇bbbbbb百度 | 亚洲熟女乱色一区二区三区 | 中文字幕av一区二区三区 | 女人扒开双腿让男人捅 | 欧美激情第1页 |