对数组进行部分排序

Partially sorting an array

本文关键字:排序 行部 数组      更新时间:2023-10-16
部分

排序可以使用std::p artial_sort完成。

部分分拣装置

5 7 4 2 8 6 1 9 0 3

对 3 个元素进行部分排序后

0 1 2 7 8 6 5 9 4 3

http://en.cppreference.com/w/cpp/algorithm/partial_sort。

但是,当某些元素已经排序时,这不是最好的。

是否有其他这样的函数可以这样做并利用部分排序的数组。

您可以使用流式中位数算法的改编来跟踪一组术语的k最小项。您可以将std::priority_queue用于最小和最大堆。

该算法的工作方式如下:

  • 最大堆用于保存k最小的项
  • 最小堆用于保存所有其他术语
  • 对于要跟踪的每个术语,确定应将其添加到哪个堆,并将其添加到其中
    • 如果最大堆的大小小于k则将其添加到其中,否则
    • 如果该项小于最大堆的顶部,请将其添加到其中,否则
    • 将术语添加到最小堆
  • 如果最大堆的顶部有超过 k 个术语,请弹出顶部术语,并将其推入最小堆

如果您需要对术语进行排序,可以按降序将它们从最大堆中弹出,以相反的顺序将它们放在数组中,从而留下一个排序的数组。如果将容器传递给最大堆的构造函数,则可以复制容器并对其进行排序。

默认情况下,std::priority_queue是最大堆。要使其成为最小堆,请修改一些模板参数。

typedef std::priority_queue<int> MaxHeap;
typedef std::priority_queue
    <
        int,
        std::priority_queue<int>::container_type,
        std::greater<int>
    > MinHeap;