在C++中从未排序列表中打印J个最大整数

在C++中从未排序列表中打印J个最大整数,c++,algorithm,pointers,new-operator,C++,Algorithm,Pointers,New Operator,我试图编写一个函数,从未排序的值数组中打印K个最大整数。我做错了什么 #include <iostream> void printKLargest(int array[], int k, int size); int main() { int array[5] = {1, 100, 2, 500, 6}; int k = 2; int size = sizeof(array)/sizeof(array[0]); findKLargest(array

我试图编写一个函数,从未排序的值数组中打印K个最大整数。我做错了什么

#include <iostream>

void printKLargest(int array[], int k, int size);

int main() {
    int array[5] = {1, 100, 2, 500, 6};
    int k = 2;
    int size = sizeof(array)/sizeof(array[0]);
    findKLargest(array, k, size);

}

void printKLargest(int array[], int k, int size) {
    int *largest = new int[k];
    for (int i = 0; i < size; i++) {
        if (array[i] > largest[0]) {
            largest[0] = array[i];
            for (int j = 1; j < k && largest[j-1] > largest[j]; j++) {
                int t = largest[j]; largest[j] = largest[j-1]; largest[j-1] = t;
            }
        }
    }
    for (int i = 0; i < k; i++) {
        std::cout << largest[i] << "\n";
    }
}
上面的代码只正确打印最大值的第一个整数。在C中我能用MALOC正确地工作,但是使用C++中的新东西有点让我失望。多谢各位


编辑-如果我将行int*max=new int[k]更改为int*max=int*mallocsizeofk;我得到了期望的值。有人能解释一下为什么会出现这种情况吗?

至少最大值指向的分配元素没有初始化

int *largest = new int[k];
因此,程序具有未定义的行为

也是在任务结束后

if (array[i] > largest[0]) {
   largest[0] = array[i];
您丢失了可以在最大[1]中复制的最大[0]的值

如果要使用标头中声明的标准算法std::partial_sort_copy,则可以简单地完成赋值

比如说

#include <vector>
#include <algorithm>
#include <functional>

//...

void printKLargest( const int array[], size_t n, size_t k ) 
{
    if ( n < k ) k = n;

    std::vector<int> largest( k );

    std::partial_sort_copy( array, array + n, 
                            largest.begin(), largest.end(),
                            std::greater<int>() );

    for ( int x : largest ) std::cout << x << ' ';
    std::cout << std::endl;
}

您可以使用动态分配的数组来代替矢量,但不要忘记删除它。

听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。如果你要做任何编程,这是一个必不可少的工具。如果这不是学术界的,我建议使用@NathanOliver,你可能会注意到这甚至是一个结束问题的理由。这里抛出的未调试代码并说“为我查找错误”与主题无关。否则我很感激你在StackOverflow上的出色工作!你说的是什么意思?“NaNaulver,但是用C++中的新东西让我有点…该函数泄漏内存。更喜欢std::vector largestk而不是new[]
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

void printKLargest( const int array[], size_t n, size_t k ) 
{
    if ( n < k ) k = n;

    std::vector<int> largest( k );

    std::partial_sort_copy( array, array + n, 
                            largest.begin(), largest.end(),
                            std::greater<int>() );

    for ( int x : largest ) std::cout << x << ' ';
    std::cout << std::endl;
}

int main()
{
    int a[] = { 5, 3, 7, 6, 3, 9, 0 };
    printKLargest( a, sizeof( a ) / sizeof( *a ), 2 );
}
9 7