一、10算法分類
本文一共總結了10種排序算法,其中
基於比較的排序算法有
冒泡排序,插入排序,希爾排序,選擇排序,歸並排序,堆排序,快速排序;
線性時間排序算法包括
計數排序,基數排序,桶排序;
前邊有提到過,基於比較的排序算法,時間復雜度最差達到O(nlogn)O(nlogn),無法突破這個界限,只有線性時間排序能夠突破,達到O(n)O(n),所以說,如果滿足了線性時間排序算法的限制條件,使用線性時間排序將會使排序性能得到極大提升。
二、實際測試數據
下面對以上涉及到的每種算法做一個簡單的實際測試對比:利用隨機數,隨機生成區間0 ~ K之間的序列,共計N個數字,利用各種算法進行排序,記錄排序所需時間,測試環境為i7+vs2015+Debug版本。
算法\輸入數據 | N=50 K=50 | N=200 K=100 | N=500 K=500 | N=2000 K=2000 | N=5000 K=8000 | N=10000 K=20000 | N=20000 K=20000 | N=20000 K=200000 |
---|---|---|---|---|---|---|---|---|
冒泡排序 | 0ms | 15ms | 89ms | 1493ms | 9363ms | 36951ms | 147817ms | 143457ms |
插入排序 | 1ms | 13ms | 82ms | 1402ms | 8698ms | 34731ms | 134817ms | 134836ms |
希爾排序 | 0ms | 1ms | 6ms | 30ms | 110ms | 257ms | 599ms | 606ms |
選擇排序 | 0ms | 5ms | 31ms | 461ms | 2888ms | 11736ms | 45308ms | 44838ms |
堆排序 | 0ms | 3ms | 9ms | 40ms | 124ms | 247ms | 525ms | 527ms |
歸並排序 | 2ms | 6ms | 18ms | 75ms | 199ms | 392ms | 778ms | 793ms |
快速排序 | 0ms | 1ms | 2ms | 14ms | 36ms | 84ms | 196ms | 163ms |
計數排序 | 0ms | 1ms | 1ms | 5ms | 15ms | 32ms | 51ms | 62ms |
基數排序 | 0ms | 1ms | 4ms | 19ms | 47ms | 114ms | 237ms | 226ms |
桶排序 | 0ms | 2ms | 6ms | 25ms | 68ms | 126ms | 254ms | 251ms |
三、性能對比小結
1. 傳統簡單排序確實當數據量很小的時候也表現不錯,但當數據量增大,其耗時也增大十分明顯;
2. 冒泡,插入,選擇三種排序中,當數據量很大時,選擇排序性能會更好;
3. 堆排,希爾,歸並,快排幾種排序算法也表現不錯,源於其時間復雜度達到了O(nlogn)O(nlogn);
4. 隨機快速排序性能確實表現十分亮眼,甚至有時比基數排序和桶排序還好,這可能也是快排如此流行的原因;
5. 線性排序中計數排序表現最好,但他們的限制也比較明顯,只能處理范圍內的正整數。