在平均情況下,快速排序和堆排序的時間複雜度都是O(n log n),堆排序的時間複雜度甚至比快速排序的時間複雜度穩定。
因爲快速排序最壞情況下時間複雜度是O(n²)。
但是,在實際的軟件開發中,快速排序的性能要比堆排序好。爲什麼?
主要有兩方面原因
堆排序數據訪問的方式沒有快速排序友好
對於快速排序來說,數據是順序訪問的。
對於堆排序來說,數據是跳着訪問的。
比如堆排序的堆化過程中,對堆頂進行堆化會依次訪問數組下標是 1,2,4,8 的元素,
而不是像快速排序那樣,局部順序訪問,所以,這樣對 CPU 緩存是不友好的。
對於同樣的數據,在排序過程中,堆排序算法的數據交換次數要多於快速排序
排序有有序度和逆序度的概念
對於基於比較的排序算法來說,整個排序過程就是由兩個基本的操作組成的,比較和交換(或移動)。
快速排序數據交換的次數不會比逆序度多。
而堆排序的第一步是建堆,建堆的過程會打亂數據原有的相對先後順序,導致原數據的有序度降低。
比如對於一組已經有序的數據來說,經過建堆之後,數據反而變得更無序了。