演算法導論 比較排序演算法對比實驗

2021-09-14 04:02:13 字數 1479 閱讀 4881

《演算法導論》這本書介紹了5種比較排序演算法:插入排序、氣泡排序、歸併排序、堆排序、快速排序。我們現在通過實驗來對比這5種排序演算法的執行時間。用隨機數發生器生成不同長度的陣列,將每種演算法應用於不同長度的陣列,統計程式的執行時間,從而得得每種演算法的期望執行時間隨輸入規模的變化曲線。

1. 全部5種演算法對比

如下圖所示,橫座標是輸入規模(陣列長度),縱座標是執行時間(單位:μsμs

μs)。其中,一騎絕塵的綠色曲線對應的是氣泡排序,書上說氣泡排序是一種很低效的演算法,實驗結果確實如此。

紅色曲線對應的是插入排序,它比綠色曲線增長要慢。雖然插入排序的期望時間複雜度與氣泡排序一樣,都為θ(n

2)θ(n^2)

θ(n2

),但是實驗結果顯示,插入排序的期望效能還是要優於氣泡排序。

剩下3條曲線增長要慢多了,它們分別對應的是歸併排序、堆排序和快速排序,三者的期望時間複雜度都為θ(n

lgn)

θ(nn)

θ(nlgn

)。在下文有三者的詳細對比。

2. 歸併排序、堆排序和快速排序對比

下圖只顯示了歸併排序、堆排序和快速排序3種期望時間複雜度都為θ(n

lgn)

θ(nn)

θ(nlgn

)的演算法的執行時間。三者中,快速排序的優勢很明顯。歸併排序和堆排序效能相對接近,歸併排序略有優勢。

3. 快速排序改進

插入排序由於實現簡單,在輸入規模較小時,插入排序相比其他演算法還是有優勢的。下圖可以印證這一點。可以看到,兩條曲線大約在橫座標為50的地方相交。如果輸入規模小於50,插入排序更有優勢。而如果輸入規模大於50,快速排序更有優勢。

根據以上分析,我們可以改進快速排序演算法:在快速排序遞迴過程中,如果子陣列規模小於50,就不繼續遞迴了,而是直接採用插入排序演算法;而如果子陣列規模大於50,繼續遞迴過程。當然,這裡設定的閾值50,只是在筆者的平台上的實驗結果,並不能說在其他平台也適用。對於不同的平台,都需要做實驗來確定這個閾值。下圖顯示了改進的快速排序演算法與標準快速排序演算法的執行時間。可以看到,這樣的改進是有效果的。

以下鏈結是實驗用的程式。最好在linux平台上跑,用g++編譯。程式用clock_t來統計演算法執行時間,在windows平台上時間精度只能到msms

ms,在linux平台上可以到μsμs

μs。

演算法導論 比較排序演算法筆記

好幾天沒看 演算法導論 今天看了一天的排序演算法,印象第一的是基數演算法,因為居然違反我的乙個常識,它採用的是最低有效位進行排序的。插入排序 歸併排序 堆排序 快速排序,這些都是比較排序演算法 它們都是通過對元素進行比較操作來確定輸入陣列的有序次序,這些演算法可以用決策樹模型分析,可以證明任意比較排...

演算法導論 排序演算法總結

從六月初開始看演算法導論,陸陸續續看了有2個月了,但實際看的時間只有半個月左右。這期間都忙著找導師 期末考試,同時還回家修養了十來天。真正專心的看演算法是在離家返校後,由於沒有考試和作業的煩惱,天天都沉浸在演算法中,感覺效率較高。這段時間學到的東西較多,下面來總結一下 比較排序有 插入排序法 合併排...

排序演算法對比

2019 september 07 排序演算法對比 排序演算法 平均時間複雜度 最好情況 最壞情況 空間複雜度 原址排序 比較排序 穩定插入排序 theta left n right theta left n right theta left n right mathbf left 1 right ...