即使是同樣的算法,不同的人寫的代碼,不同的應用場景下執行時間也可能差別很大。下面是一個測試數據:
測試的平均排序時間:數據是隨機整數,時間單位是s 數據規模 快速排序 歸並排序 希爾排序 堆排序 1000萬 0.75 1.22 1.77 3.57 5000萬 3.78 6.29 9.48 26.54 1億 7.65 13.06 18.79 61.31
大數據量下,快速排序優於歸並排序優於堆排序。
原因如下:
快速排序 vs 歸並排序
當數據量越來越大時,
歸並排序:比較次數少,速度慢。
快速排序:比較次數多,速度快。
快速排序的優勢越來越明顯。
原因分析:個人認為是當數據量越來越大時,盡管歸並排序的比較次數較少,但是歸並排序后期的合並操作所花費的時間便越來越大,合並操作對整體的效率影響越來越明顯,包括后面大量數據的賦值操作等。所以當數據量變大時,不需要專門合並的快速排序的優勢就變得越發明顯。
快速排序 vs 堆排序
堆排序每次取一個最大值和堆底部的數據交換,重新篩選堆,把堆頂的X調整到位,有很大可能是依舊調整到堆的底部(堆的底部X顯然是比較小的數,才會在底部),然后再次和堆頂最大值交換,再調整下來,可以說堆排序做了許多無用功。
總結起來就是,快排的最壞時間雖然復雜度高,但是在統計意義上,這種數據出現的概率極小,而堆排序過程里的交換跟快排過程里的交換雖然都是常量時間,但是常量時間差很多。