我试图编写一个从未排序值数组中打印出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));
,我会获得所需的值。有人可以解释为什么会这样吗?
答案 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
您可以使用动态分配的数组代替向量,但不要忘记删除它。