使用优先级队列的 K 排序数组 - C++

Posted

技术标签:

【中文标题】使用优先级队列的 K 排序数组 - C++【英文标题】:K sorted array using priority queue - C++ 【发布时间】:2020-04-29 10:38:06 【问题描述】:

我正在使用 C++ 中的优先级队列实现 k 排序数组。在输出中,只有前 k 个元素被排序,其余的没有。请在代码中找到问题。

代码如下:

#include <iostream>
#include <queue>
using namespace std;

void kSortedArray(int input[], int n, int k)
    priority_queue<int> pq;
    for(int i= 0; i < k; i++)
        pq.push(input[i]);
    

    int j = 0;
    for(int i = k; i < n; i++)
        int ans = pq.top();
        pq.pop();
        input[j] = ans;
        pq.push(input[i]);
        j++;
    

    while(pq.size() != 0)
        input[j] = pq.top();
        pq.pop();
    






int main() 
    int input[] = 10, 12, 6, 7, 9;
    int k = 3;
    kSortedArray(input, 5, k);
    for(int i = 0; i < 5; i++)
        cout << input[i] << " ";
    

【问题讨论】:

注意std提供std::partial_sort 请参阅***.com/help/how-to-ask。仅仅发布代码并要求我们找出问题并不是一个很好的问题。你应该告诉我们你看到了什么错误。问题是您没有得到正确的输出,然后向我们展示输入、预期输出和实际输出。 【参考方案1】:

更正这部分(你忘了增加j):

    while(pq.size() != 0)
        input[j++] = pq.top(); // <-- this line
        pq.pop();
    

您的代码也按降序排序。如果要按升序排序,请使用 minheap:

priority_queue<int,vector<int>, greater<int>> pq;

【讨论】:

以上是关于使用优先级队列的 K 排序数组 - C++的主要内容,如果未能解决你的问题,请参考以下文章

合并 k 排序数组 - 优先队列与传统合并排序合并,何时使用哪个?

[转]c++优先队列(priority_queue)用法详解

为啥我需要在 C++ 中使用不同的排序格式来对这个 USACO 代码上的数组和优先级队列进行排序?

c++优先队列(priority_queue)用法详解

数组中的第K个最大元素 优先队列

堆和堆排序