c++ 获得堆的排序版本的最快的非破坏性方法?

k5hmc34c  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个优先级堆来存放一个事件队列。
我需要按顺序为用户转储这些内容,* 但不要使堆变得不可用 *。
显然,如果我愿意销毁它,我可以简单地将事件从队列中取出,直到它为空,然后将它们按顺序添加到我的排序列表中。但是,堆当然会消失。此外,快速排序比堆排序快得多,我不相信我能比我复制堆并对副本排序更快地构建排序列表。
我的一个想法是通过将堆中的所有元素出队来破坏堆,但是随后......用排序后的列表替换现在为空的优先级队列,这样可以保持堆的属性(单元格i的优先级高于单元格i * 2+1和i * 2+2),所以我也想知道这样的堆是否会比常规堆性能更好。
最简单的解决方案是复制堆数组,然后对副本进行排序,但是当给定排序或部分排序的数据时,有些排序会做得很差,我想知道是否可以信任标准C++库的sort(或C qsort())来高效地处理堆排序?

qeeaahzv

qeeaahzv1#

在通常的堆实现中,只需要在适当的位置对堆进行排序。排序后的列表满足最小堆的堆条件。或者,如果你对堆进行降序排序,你就满足最大堆的堆条件。如果你需要的话,你总是可以对它进行一种排序,然后遍历另一种。
请注意,sort::heap文档警告您不要破坏堆条件,如果您正在更改堆数据,请注意您没有这样做。

相关问题