当前位置: 首页 > 知识库问答 >
问题:

对数组进行部分排序

贺正祥
2023-03-14

部分排序可以通过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.

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

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

共有1个答案

凌长恨
2023-03-14

您可以使用流式处理中位数算法的改编来跟踪一组术语的 k 个最小项。您可以使用 std::p riority_queue 作为最小堆和最大堆。

算法是这样工作的:

  • 最大堆用于保存k最小项
  • 最小堆用于保存所有其他项。
  • 对于要跟踪的每个术语,决定应将其添加到哪个堆,并将其添加到此堆
    • 如果最大堆的大小小于k请将其添加到那里,否则
    • 如果该项小于最大堆的顶部,请将其添加到那里,否则
    • 将术语添加到最小堆

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

    默认情况下,< code>std::priority_queue是一个最大堆。要使它成为最小堆,需要修改一些模板参数。

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

 类似资料:
  • 问题内容: 我想知道,流(或收集器)中是否已经有一个已实现的功能,已将列表作为值进行了排序。例如,以下代码均产生按年龄分组的按性别分组的人员清单。第一个解决方案具有一些开销排序(看起来有些sc琐)。第二种解决方案需要对每个人进行两次检查,但是必须做到很好。 首先排序,然后分组为一个流: 首先分组,然后对每个值进行排序: 我只是想知道,是否已经实现了某项功能,该功能可以一次运行,例如。 问题答案:

  • 我想知道,流(或收集器)中是否已经实现了将列表排序为值的功能。例如,以下代码均生成按年龄排序的按性别分组的人员列表。第一个解决方案有一些开销排序(看起来有点邋遢)。第二种解决方案需要对每个人进行两次检查,但工作做得很好。 首先排序,然后在一个流中分组: 首先分组,然后对每个值进行排序: 我只是想知道,是否已经实现了一些东西,可以在一次运行中完成,比如。

  • 主要内容:算法总结及实现,优化算法在实际开发中,有很多场景需要我们将数组元素按照从大到小(或者从小到大)的顺序排列,这样在查阅数据时会更加直观,例如: 一个保存了班级学号的数组,排序后更容易分区好学生和坏学生; 一个保存了商品单价的数组,排序后更容易看出它们的性价比。 对数组元素进行排序的方法有很多种,比如冒泡排序、归并排序、选择排序、插入排序、快速排序等,其中最经典最需要掌握的是「冒泡排序」。 以从小到大排序为例,冒泡排序的整体

  • 我希望根据记录的整数值降序排序:

  • 我有一个过程对象列表,如下所示 我的程序课就像 我想基于以下条件对对象进行排序和分组。 应根据过程名称对所有过程进行分组。 过程必须按过程日期降序排列。[日期列表中的第一个元素,即 分组在一起的相同过程应按日期降序排列。 最终结果必须是, 我能够使用比较器和旧的Java代码实现这一点。是否可以使用java8流、收集器和分组来实现相同的功能?

  • 问题内容: 如何对pandas groupby操作应用排序?下面的命令返回一个错误,指出“布尔”对象不可调用 问题答案: 通常,排序是在groupby键上执行的,并且您发现您无法调用groupby对象,您可以做的是调用并传递函数并将列作为kwarg参数传递: 另外,您可以在分组之前对df进行排序: 更新资料 对于不建议使用的版本,请参见docs,现在应使用: 在这里在评论中添加@xgdgsc的答案