C++程序——按原始顺序查找最大的k个元素

C++程序——按原始顺序查找最大的k个元素

给定一个数组arr[]和一个整数k,我们需要按输入顺序输出给定数组的前k个最大元素。
注意: k始终小于或等于n。

例子:

输入:arr [] = {10 50 30 60 15}
        k = 2
输出:50 60
根据它们在原始数组中的出现顺序打印前2个元素。
输入:arr [] = {50 8 45 12 25 40 84}
        k = 3
输出:50 45 84 

_{IDE} _

方法1: 我们在给定数组中搜索最大的元素k次。每次我们找到一个最大的元素,我们打印它并将其替换为数组中的负无穷大(C语言中的INT_MIN)。此方法的时间复杂度为O(n*k)。

// C++程序 - 查找k个最大元素
#include <bits/stdc++.h>
using namespace std;
 
// 打印k个最大元素的函数
void printMax(int a[], int n, int k)
{
    int b[n],c[n];
     
    // 将数组a复制到c中,并将数组b中
    // 的元素初始化为0。
    for(int i=0;i<n;i++)
    {
        c[i]=a[i];
        b[i]=0;
    }
     
    // 迭代k次以找到前k个最大元素
    for(int i=0;i<k;i++)
    {
        // 找到最大的元素和它的索引
        int maxi=INT_MIN;
        int index;
        for(int j=0;j<n;j++)
        {
            if(a[j]>maxi)
            {
                maxi=a[j];
                index=j;
            }
        }
        // 按顺序将1分配到k个最大数字的位置
        b[index]=1;
        a[index]=INT_MIN;
    }
     
    for(int i=0;i<n;i++)
    {
        // 打印数组中的k个最大元素
        if(b[i]==1)
        cout<<c[i]<<" ";
    }
}
 
// 驱动程序
int main()
{
    int a[] = { 50, 8, 45, 12, 25, 40, 84 };
    int n = sizeof(a) / sizeof(a[0]);
    int k = 3;
    printMax(a, n, k);
    return 0;
}
 
// 本代码由Aman kumar贡献。```  

输出

50 45 84 

时间复杂度: O(n*k)
辅助空间: O(n)

方法2: 在此方法中,我们将原始数组存储在新数组中,并按降序对新数组进行排序。排序后,我们从0到n遍历原始数组,并打印所有出现在新数组的前k个元素中的元素。为了搜索,我们可以进行二进制搜索。

// C++程序——按原始顺序查找k个最大元素
#include <bits/stdc++.h>
using namespace std;
 
// 打印m个最大元素的函数
void printMax(int arr[], int k, int n)
{
    // 向量存储原数组的拷贝
    vector<int> brr(arr, arr + n);
 
    // 按降序对向量排序。请参见以下链接
    // 的详情
    // https://www.geeksforgeeks.org/sort-c-stl/
    sort(brr.begin(), brr.end(), greater<int>());
 
    // 遍历原数组并打印所有
    // 出现在排序向量的前k个元素中的元素
    // 请参见 https://goo.gl/44Rwgt
    // 关于二进制搜索的详细信息()
    for (int i = 0; i < n; ++i)
        if (binary_search(brr.begin(),
                 brr.begin() + k, arr[i],
                        greater<int>()))
            cout << arr[i] << " ";
}
 
// 驱动程序
int main()
{
    int arr[] = { 50, 8, 45, 12, 25, 40, 84 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 3;
    printMax(arr, k, n);
    return 0;
}  

输出:

50 45 84 

时间复杂度:对于排序,O(n Log n)。
辅助空间:O(n)

请参考完整文章以了解如何在原始顺序中找到k个最大元素!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例