插入排序是基于优先队列的排序算法吗? 使用优先队列进行排序

问题描述

插入排序是基于队列的优先排序算法吗?堆排序也是基于 PQ 的吗?

解决方法

关于 Priority queue 的维基百科文章解释了优先级队列和排序算法之间的关系:

使用优先队列进行排序

优先级队列的语义自然暗示了一种排序方法:将所有需要排序的元素插入到一个优先级队列中,依次取出;它们将按排序顺序出现。这实际上是几种排序算法使用的过程,一旦优先级队列提供的抽象层被移除。这种排序方法等价于以下排序算法:

名称 优先队列实现 最佳 平均 最差
堆排序 ?log⁡(?) ?log⁡(?) ?log⁡(?)
平滑排序 莱昂纳多堆 ? ?log⁡(?) ?log⁡(?)
选择排序 无序数组
插入排序 有序数组 ?
树排序 自平衡二叉搜索树 ?log⁡(?) ?log(?) ?log(?)

所以,是的,您当然可以说 heapsort 构建了一个优先级队列(具有高效的实现)。对于插入排序,它不太明显,因为正在构建的优先级队列实际上是一个已排序的子数组。但是由于排序数组表示堆,因此插入排序也可以说是构建和使用优先级队列,但效率较低。由于队列是一个已排序的数组,因此上面引用的算法的“删除”部分对于插入排序是不必要的。