在C++中从未排序列表中打印J个最大整数
我试图编写一个函数,从未排序的值数组中打印K个最大整数。我做错了什么在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
#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