我如何在c++中做到这一点,从这个列表中打印出最高的10个数字
How do i do this in c++, print the highest 10 numbers out of this list?
如何打印出列表中最高的10个数字?
这是我的数字列表,我是编程新手,我知道我必须使用数组,但我不确定之后。
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71
您将需要查看std::partial_sort
函数,以及operator>
。
如果您将这些数字保存在一个向量中,您可以使用std::sort()
将数字放入数组中(理想情况下,读取文件中的数字列表)将数组按降序排序(使用现有函数,如其他答案所建议的,或者,我想这是一个课程练习,使用课堂上解释的算法)For (i = 0;i<10;我+ +)打印数组[我];
对不起,它开始看起来像代码…
先对数组排序。
获取数组的大小,并将其用作索引。然后编写如下的for循环:
for(int index = size -1; index >=0; index--)
// print here
如果列表非常大,使用sort
不是很有效,因为您只想找到10
最大的元素。更好的方法是用10
元素构建最小堆,当堆大小小于10
时,将元素插入堆中。之后,当新元素出现时,将元素与堆的根进行比较,如果元素大于根,则插入到堆中并删除当前堆头,此过程重复直到您完成扫描列表中的所有元素。该算法的时间复杂度为"O(nlogk)",其中n
为元素总数,k
为10。如果在O(nlogn)
中使用排序,效率会更高。你需要了解二进制堆是如何在c++中工作的,你可以应用std容器来实现一个很容易为你工作的。
然而,使用std::sort
是蛮力的方式,易于理解。
您可以通过几种方式做到这一点:假设你的列表中有N个元素你必须选出X个最高的元素。1)排序你的数组,然后选择X最高元素的元素。现在,由于排序将花费O(NlogN)时间,而您的选择将花费O(X)时间,因此总体复杂度将为O(NlogN)。
2)不排序你的数组,只是遍历列表找到最高的元素,然后再遍历找到下一个最高的元素,直到你得到X个最高的元素。复杂度O(X*N)当X 下面应该可以工作: 关于复杂性的注释,正如其他人已经指出的那样。在这种情况下,使用partial_sort通常更好,因为它在这种情况下具有更好的复杂性。但是如果你只是摆弄一个玩具实例,那么一个完整的排序也可以解决你的问题。 下次,展示更多的努力,像你尝试过的代码和你在文献中找到的,等等#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v;
for(unsigned i = 0; i < 100; ++i) {
v.push_back(i);
}
std::random_shuffle(v.begin(), v.end());
std::partial_sort(v.begin(), v.begin() + 4, v.end());
for(unsigned k = 0; k < 4; ++k) {
std::cout << k << "-th element is " << v[k] << 'n';
}
}
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 链接列表运算符重载没有打印出我想要的内容
- 如何实现否定用户输入退出程序和打印列表?
- 如何编写循环以通过列表迭代并打印列表中每个元素的数据的数据
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 打印列表列表C++ STL 列表
- 使用 const 和 打印列表
- 为什么数组不打印列表
- 似乎无法使用<VERTEX>迭代器在 for 循环中打印列表顶点?C++
- 用c++打印列表
- 子集总和 打印列表
- 使用指向列表的指针打印列表
- 在C++中打印列表元素的组件
- 按字母顺序降序对列表进行排序,然后打印列表
- 向后打印列表
- 无限打印列表功能
- 递归打印列表
- 如何打印列表<类*> LS?
- f流<无法读取内存>。打印列表中所有项目时遇到问题
- 排序算法在试图打印列表信息时崩溃