在平均情况下,快速排序和堆排序的时间复杂度都是O(n log n),堆排序的时间复杂度甚至比快速排序的时间复杂度稳定。
因为快速排序最坏情况下时间复杂度是O(n²)。
但是,在实际的软件开发中,快速排序的性能要比堆排序好。为什么?
主要有两方面原因
堆排序数据访问的方式没有快速排序友好
对于快速排序来说,数据是顺序访问的。
对于堆排序来说,数据是跳着访问的。
比如堆排序的堆化过程中,对堆顶进行堆化会依次访问数组下标是 1,2,4,8 的元素,
而不是像快速排序那样,局部顺序访问,所以,这样对 CPU 缓存是不友好的。
对于同样的数据,在排序过程中,堆排序算法的数据交换次数要多于快速排序
排序有有序度和逆序度的概念
对于基于比较的排序算法来说,整个排序过程就是由两个基本的操作组成的,比较和交换(或移动)。
快速排序数据交换的次数不会比逆序度多。
而堆排序的第一步是建堆,建堆的过程会打乱数据原有的相对先后顺序,导致原数据的有序度降低。
比如对于一组已经有序的数据来说,经过建堆之后,数据反而变得更无序了。