C++ 求向量中的n个最大值

C++ 求向量中的n个最大值,c++,C++,我现在有一个向量,需要找到其中n个最大的数。例如,一个用户输入5,我必须遍历它并输出最大的5。问题是,由于其他限制,我无法对该向量进行排序。最好的办法是什么 谢谢 复制和排序是一种选择吗?我的意思是,如果您的应用程序的性能不是那么关键,那么这是最简单、渐进且不太糟糕的方法 类似这样的东西A是传入向量,N是要查找的最大数,v成为结果向量: vector<T> v(N, 0); for each element in A: if (element > v[N-1])

我现在有一个向量,需要找到其中n个最大的数。例如,一个用户输入5,我必须遍历它并输出最大的5。问题是,由于其他限制,我无法对该向量进行排序。最好的办法是什么


谢谢

复制和排序是一种选择吗?我的意思是,如果您的应用程序的性能不是那么关键,那么这是最简单、渐进且不太糟糕的方法

类似这样的东西A是传入向量,N是要查找的最大数,v成为结果向量:

vector<T> v(N, 0);   
for each element in A:
   if (element > v[N-1])
       for(i = N-1; i > 0 && v[i] < element; i--)
          v[i] = v[i-1];
       v[i] = element;

这是一种伪C++,不完全是C++,但希望描述一下你是如何做到这一点的。p> 基于您对不修改原始向量的描述以及我的假设,即您希望顺序重要,我建议:


约束条件是什么?如果打印顺序无关紧要,std::nth_元素似乎适合您的情况。如果顺序确实重要,请尝试std::partial_排序。甚至还有std::partial_sort_copy,它保持原始向量不变,不需要复制所有向量。由于其他向量依赖于此向量索引,因此无法排序。您是否应该编写实际代码,或者你应该想出一些解决问题的方法吗?你可以在线性时间内保持一个最多n项的向量。你遍历列表中的每个元素,将它们与大值向量中的元素进行比较,并在遍历列表时将较小的值替换为较大的值。我所评论的算法同样简单,因此最好使用它们,而不是毫无理由地对整件事进行排序。我同意复制它不应该是一个大问题。部分排序不会改变向量吗?据我所知,你保留了一个排序向量v,并且只比较新元素和这个排序向量上最高的元素。我的问题是:当一个新元素要被排序,但它的值在这个排序向量的最小值和最大值之间时会发生什么?除非我的比较方法错误,否则它应该是最低的索引是最高的值,所以与v[N-1]的比较是找到收集到的高值中的最低值,然后将其插入正确的位置。我没有实现完全C++代码,所以我写的可能有一些小错误,但是这个想法应该是正确的。
//assume vector<int> as source
std::vector<int> dest(n); //largest n numbers; VLA or std::dynarray in C++14
std::partial_sort_copy(
    std::begin(source), std::end(source), //.begin/.end in C++98/C++03
    std::begin(dest), std::end(dest), 
    std::greater<int>() //remove "int" in C++14
);
//output dest however you want, e.g., std::copy