階段總結(四)——爲什麼同爲O(n log n),快速排序的性能比堆排序要好?

在平均情況下,快速排序和堆排序的時間複雜度都是O(n log n),堆排序的時間複雜度甚至比快速排序的時間複雜度穩定。

因爲快速排序最壞情況下時間複雜度是O(n²)。

但是,在實際的軟件開發中,快速排序的性能要比堆排序好。爲什麼?

 

主要有兩方面原因

 

堆排序數據訪問的方式沒有快速排序友好

 

對於快速排序來說,數據是順序訪問的。

對於堆排序來說,數據是跳着訪問的。

比如堆排序的堆化過程中,對堆頂進行堆化會依次訪問數組下標是 1,2,4,8 的元素,

而不是像快速排序那樣,局部順序訪問,所以,這樣對 CPU 緩存是不友好的。

 

對於同樣的數據,在排序過程中,堆排序算法的數據交換次數要多於快速排序

排序有有序度和逆序度的概念

對於基於比較的排序算法來說,整個排序過程就是由兩個基本的操作組成的,比較和交換(或移動)。

快速排序數據交換的次數不會比逆序度多。

而堆排序的第一步是建堆,建堆的過程會打亂數據原有的相對先後順序,導致原數據的有序度降低。

比如對於一組已經有序的數據來說,經過建堆之後,數據反而變得更無序了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章