我如何在c++中做到这一点,从这个列表中打印出最高的10个数字

How do i do this in c++, print the highest 10 numbers out of this list?

本文关键字:打印 列表 10个 数字 c++ 这一点      更新时间:2023-10-16

如何打印出列表中最高的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

下面应该可以工作:

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

关于复杂性的注释,正如其他人已经指出的那样。在这种情况下,使用partial_sort通常更好,因为它在这种情况下具有更好的复杂性。但是如果你只是摆弄一个玩具实例,那么一个完整的排序也可以解决你的问题。

下次,展示更多的努力,像你尝试过的代码和你在文献中找到的,等等