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

时间:2015-08-13 16:50:54

标签: 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, 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";
    }
}

上面的代码只能正确打印largest的第一个整数。在C中,我能够使用malloc使其正常工作,但在C ++中使用new会让我失望。谢谢。

编辑 - 如果我将行int *largest = new int[k]更改为int *largest = (int *)malloc(sizeof(k));,我会获得所需的值。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

至少指定的最大分配元素未初始化

int *largest = new int[k];

因此程序有不确定的行为。

在作业之后

if (array[i] > largest[0]) {
   largest[0] = array[i];

您丢失了可以在largest[0]中复制的largest[1]的价值。

如果要使用标题std::partial_sort_copy中声明的标准算法<algorithm>,则可以轻松完成分配

例如

#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;
}

这是一个示范程序

#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

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