我如何在c ++中执行此操作,打印此列表中最高的10个数字?

时间:2013-03-27 16:13:14

标签: c++

如何打印此列表中最高的10个数字?

这是我的数字列表,我是编程新手,我知道我必须使用数组,但我不确定之后。

     2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71

7 个答案:

答案 0 :(得分:4)

您需要结合operator>查看std::partial_sort函数。

答案 1 :(得分:1)

如果将这些数字保存在矢量中,则可以使用std :: sort()

答案 2 :(得分:0)

将您的数字放入数组中 (理想情况下读取文件中的数字列表) 按递减顺序对数组进行排序(使用现有函数,如其他答案所提出的,或者,因为我认为这是一个课程练习,通过使用课堂上解释的算法) for(i = 0; i< 10; i ++) print array [i];

抱歉,它看起来像代码......

答案 3 :(得分:0)

首先对数组进行排序。

获取数组的大小,并将其用作索引。然后写一个for循环,如:

for(int index = size -1; index >=0; index--) 
    // print here

答案 4 :(得分:0)

如果列表非常大,使用sort效率不高,因为您只想查找10个最大元素。更好的方法是使用10元素构建一个小堆,当堆大小小于10时,将元素插入堆中。之后,当新元素到来时,将元素与堆的根进行比较,如果元素大于root,插入堆并删除当前堆头,则此过程将重复,直到您完成扫描列表中的所有元素。此算法使用时间复杂度“O(nlogk)”,其中n是元素的总数,k在这种情况下为10。如果使用排序,则O(nlogn)更有效。您需要了解二进制堆如何在C ++中工作,并且您可以应用std容器来实现一个非常容易为您工作的容器。

但是,使用std::sort是一种蛮力方式,易于理解。

答案 5 :(得分:0)

您可以通过以下几种方式执行此操作: 假设列表中有N个元素,则必须选择X个最高元素。 1)对数组进行排序,然后选择X个最高元素元素。现在排序将花费O(NlogN)时间并且您的选择将花费O(X)时间整体复杂度将为O(NlogN)。

2)不要对数组进行排序,只需遍历列表以找到最高元素,然后再遍历以找到下一个最高元素,依此类推,直到获得X个最高元素。当X <0时,复杂度O(X * N)是最后一种方法更好的。 logN个

3)您可以通过使用固定(X)大小的最大堆来优化方法2,如果列表插入元素大于最大堆中的最小元素,则将列表插入元素遍历到列表中。复杂度O(NLogX)。

答案 6 :(得分:0)

以下内容应该有效:

#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通常更好,因为它在这种情况下具有更好的复杂性。但是,如果您只是玩玩具实例,那么完整的排序也可以解决您的问题。

下次,展示一些更多的努力,比如你尝试过的代码和你在文学中找到的代码等等。