快速排序到底有多快?

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

在這裏插入圖片描述

1、實驗設計

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

1.實驗排序算法

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

2.數據集規模

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

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、實驗結果

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

1.隨機數排序結果

n=10

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

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.快排優化方案成立

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

相關文章
相關標籤/搜索