【问题标题】:Partially sorting an array对数组进行部分排序
【发布时间】:2012-07-04 06:00:13
【问题描述】:

可以使用 std::partial_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.

但最好是某些元素已经排序。

还有其他这样的功能可以做到这一点并利用部分排序的数组。

【问题讨论】:

  • 你在搜索intertubes的时候有没有发现?
  • "但是,当某些元素已经排序时,这并不是最好的选择。" 你这个说法的依据是什么?
  • 实际上我正在应用我的代码并且已经超过了时间限制。
  • 部分排序的应用程序是什么?堆数据结构会更合适吗?

标签: c++ algorithm sorting


【解决方案1】:

您可以使用streaming median 算法的改编版来跟踪一组术语中的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;

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多