Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对数组进行部分排序_C++_Algorithm_Sorting - Fatal编程技术网

C++ 对数组进行部分排序

C++ 对数组进行部分排序,c++,algorithm,sorting,C++,Algorithm,Sorting,可以使用std::Partial_sort完成部分排序 部分排序方法 5742861903 对3个元素进行部分排序后 0127865943 但当某些元素已经被排序时,这并不是最好的 还有其他这样的函数可以这样做并利用部分排序数组。您可以使用算法的自适应来跟踪一组术语中的k最小术语。您可以对最小和最大堆使用std::priority\u queue 算法的工作原理如下: 最大堆用于保存k最小项 最小堆用于保存所有其他术语 对于要跟踪的每个术语,决定应该将其添加到哪个堆,并将其添加到那里 如果

可以使用std::Partial_sort完成部分排序

部分排序方法

5742861903

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

0127865943

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


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

您可以使用算法的自适应来跟踪一组术语中的
k
最小术语。您可以对最小和最大堆使用
std::priority\u queue

算法的工作原理如下:

  • 最大堆用于保存
    k
    最小项
  • 最小堆用于保存所有其他术语
  • 对于要跟踪的每个术语,决定应该将其添加到哪个堆,并将其添加到那里
    • 如果最大堆的大小小于
      k
      将其添加到那里,否则
    • 如果该项小于最大堆的顶部,请将其添加到那里,否则
    • 将术语添加到最小堆
  • 如果最大堆的顶部有超过
    k个
    项,则弹出顶部项,并将其推入最小堆
如果需要对术语进行排序,可以按降序将它们从最大堆中弹出,以相反的顺序将它们放入数组中,留下一个已排序的数组。如果将容器传递给max heap的构造函数,则可以复制容器并对其排序

默认情况下,
std::priority_队列是一个最大堆。要使其成为最小堆,需要修改一些模板参数

typedef std::priority_queue<int> MaxHeap;
typedef std::priority_queue
    <
        int,
        std::priority_queue<int>::container_type,
        std::greater<int>
    > MinHeap;
typedef std::priority_queue MaxHeap;
typedef std::优先级_队列
<
int,
std::优先级\队列::容器\类型,
标准::更大
>肉堆;

在搜索Intertube时,您是否找到了任何代码?请看一看,“但当某些元素已经排序时,这不是最好的。”您是基于什么来做此陈述的?实际上,我正在应用代码,并且超过了时间限制。您的部分排序的应用程序是什么?堆数据结构是否更适合?