C++ c++;:仅对前5个最大值进行排序的最佳排序算法 向量arr=[3,89,97,8,67,6,3,2,56,78,1,45,63,4,53]

C++ c++;:仅对前5个最大值进行排序的最佳排序算法 向量arr=[3,89,97,8,67,6,3,2,56,78,1,45,63,4,53],c++,C++,我打算按从低到高的顺序提取[53,63,78,89,97]-前5个元素 请帮我做以下几点: 首先,在算法复杂性方面,低于代码的成本会更高吗 vector<int> arr = [3, 89, 97, 8, 67, 6, 3, 2, 56, 78, 1, 45, 63, 4, 53] 排序(arr.begin(),arr.end(),greater()); 对于(int j=9;j>=0;j--){ 这里有一些你可以探索的想法。我还没有给出解决方案 更一般问题的解决方案: 搜索。预

我打算按从低到高的顺序提取[53,63,78,89,97]-前5个元素 请帮我做以下几点:

首先,在算法复杂性方面,低于代码的成本会更高吗

vector<int> arr = [3, 89, 97, 8, 67, 6, 3, 2, 56, 78, 1, 45, 63, 4, 53]
排序(arr.begin(),arr.end(),greater()); 对于(int j=9;j>=0;j--){
这里有一些你可以探索的想法。我还没有给出解决方案

更一般问题的解决方案:

搜索。预期的平均案例运行时间为O(n)。 然后,它只是另一个循环的问题,将大于该统计的元素划分为小于该统计的元素。类似于Quicksort

所以总体复杂度仍然是O(n)

现在,您的问题涉及成本发现的5个最佳要素:

这与复杂性无关。人们可以遵循多种方法:

如果您想要前两个元素,该怎么办:

最有效的方法之一是维护两个变量
最大的
第二大的
,并用一次循环更新它们

sort(arr.begin(), arr.end(), greater<char>());
for (int j = 9; j>=0;j--){
    cout << "Array elements: " << arr[j] << endl;
}
inta[]={1,2,3,4,5,6,6,785675675673345242234231,12,12,50};
int-max=-1,second_-max=-1;//让我们假设数字是正的,这没关系。
对于(int i=0;i最大)
{
第二大=最大;
最大值=a[i];
}
else if(a[i]>第二大)
第二大=a[i];
现在,由于您想要排名前5位的元素,您仍然可以这样做。也许这在周期精确运行时间方面是最好的。

另一种方法是维护一个堆。有一些有趣的方法可以使用堆来解决您的问题。(同样,我也没有透露太多)

最后评论:这种方法用于手机联系人目录,一旦你打开它们,它们就会以某种顺序向你显示一些排名前十的联系人。因此也有很多关于这方面的研究论文

非常有趣的是,当应用到现实生活中时,一个简单的问题可以导致一些复杂的解决方案


我希望您喜欢阅读并自己探索,以找到最适合您的内容。

您正在寻找
std::partial_sort
功能:

int a[] = {1,2,3,4,5,6,6,78,567,5675673,345242,234,231,12,12,50};
int largest = -1,second_largest = -1; // Let's assume numbers are positive. It doesn't matter.
for (int i=0;i<N;i++)
    if (a[i] > largest)
    {
        second_largest = largest;
        largest = a[i];
    }
    else if (a[i] > second_largest)
        second_largest = a[i];
partial_排序(arr.begin(),arr.begin()+5,arr.end(),greater());
这在一开始就为您提供了最棒的五个元素,而不需要对其余元素进行排序


运行时间是O(N log K),其中N是数组的大小,K是您感兴趣的元素的数量,因此如果K=5是固定的,那么它将是O(N)。

您所说的“低于代码会花费更多”是什么意思?与什么相比?复杂性和成本是完全不同的。请不要混淆两者。成本指的是性能,而比较则是第一种方法和第二种方法。提到的两种方法中,没有一种比自然直接的方法更有效,即只扫描阵列并保持five最高值,即线性复杂度。向量
arr
包含
int
s,但如果有意使用
greater()
,那么为什么?我认为应该使用
greater()
partial_sort(arr.begin(), arr.begin() + 5, arr.end(), greater<char>());