问题描述
插入排序是基于队列的优先排序算法吗?堆排序也是基于 PQ 的吗?
解决方法
关于 Priority queue 的维基百科文章解释了优先级队列和排序算法之间的关系:
使用优先队列进行排序
优先级队列的语义自然暗示了一种排序方法:将所有需要排序的元素插入到一个优先级队列中,依次取出;它们将按排序顺序出现。这实际上是几种排序算法使用的过程,一旦优先级队列提供的抽象层被移除。这种排序方法等价于以下排序算法:
名称 | 优先队列实现 | 最佳 | 平均 | 最差 |
---|---|---|---|---|
堆排序 | 堆 | ?log(?) | ?log(?) | ?log(?) |
平滑排序 | 莱昂纳多堆 | ? | ?log(?) | ?log(?) |
选择排序 | 无序数组 | ?² | ?² | ?² |
插入排序 | 有序数组 | ? | ?² | ?² |
树排序 | 自平衡二叉搜索树 | ?log(?) | ?log(?) | ?log(?) |
所以,是的,您当然可以说 heapsort 构建了一个优先级队列(具有高效的实现)。对于插入排序,它不太明显,因为正在构建的优先级队列实际上是一个已排序的子数组。但是由于排序数组表示堆,因此插入排序也可以说是构建和使用优先级队列,但效率较低。由于队列是一个已排序的数组,因此上面引用的算法的“删除”部分对于插入排序是不必要的。