如何打印此列表中最高的10个数字?
这是我的数字列表,我是编程新手,我知道我必须使用数组,但我不确定之后。
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71
答案 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通常更好,因为它在这种情况下具有更好的复杂性。但是,如果您只是玩玩具实例,那么完整的排序也可以解决您的问题。
下次,展示一些更多的努力,比如你尝试过的代码和你在文学中找到的代码等等。