📌  相关文章
📜  C++程序以原始顺序查找数组的k个最大元素(1)

📅  最后修改于: 2023-12-03 14:59:52.099000             🧑  作者: Mango

C++程序实现原始顺序查找数组的k个最大元素

本文将介绍使用C++实现原始顺序查找数组的k个最大元素的方法,这种算法效率并不高,但是简单易懂。适用于数据量较小的情况。

算法介绍

此算法基于选择排序,每次在未排序的元素中选择一个最大的元素,将其放置在数组尾部。我们可以使用类似的方法,但是只将数组中的k个最大元素存储在一个数组中。

先创建一个大小为k的新数组,将原始数组中的前k个元素按从大到小的顺序存储在该数组中。然后遍历原始数组中的其余元素,如果该元素大于新数组中所有元素,则将其插入到新数组中,并将最小元素删除。

实现步骤
  1. 创建一个大小为k的新数组,并将原始数组中的前k个元素按从大到小的顺序存储在该数组中。
  2. 遍历原始数组中剩余的元素,如果该元素大于新数组中的所有元素,则将其插入到新数组中,并将最小元素删除。
  3. 返回新数组中的k个最大元素。
代码实现

下面的代码演示了如何实现这个算法。其中k为要查找的最大元素的个数,arr为原始数组。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<int> find_k_largest(int arr[], int n, int k) {
    vector<int> ans(k, 0);
    for (int i = 0; i < k; i++) ans[i] = arr[i];
    sort(ans.begin(), ans.end());

    for (int i = k; i < n; i++) {
        if (arr[i] > ans[0]) {
            ans.erase(ans.begin());
            ans.insert(lower_bound(ans.begin(), ans.end(), arr[i]), arr[i]);
        }
    }
    return ans;
}

int main() {
    int n, k;
    cout << "请输入数组的元素个数和要查找的最大元素的个数:";
    cin >> n >> k;
    int arr[n];
    cout << "请输入数组的元素:";
    for (int i = 0; i < n; i++) cin >> arr[i];

    vector<int> ans = find_k_largest(arr, n, k);
    cout << "数组中的前" << k << "个最大的元素为:";
    for (int i = 0; i < k; i++) cout << ans[i] << " ";
    cout << endl;

    return 0;
}

代码解释:

  • 为了方便,使用了STL的vector容器。其中vector ans(k, 0)创建了大小为k的空数组。
  • for (int i = 0; i < k; i++) ans[i] = arr[i] 将原始数组中的前k个元素按从大到小的顺序存储在该数组中。
  • sort(ans.begin(), ans.end()) 将数组按从小到大的顺序排序。排序后,ans[0]即为新数组中最小的元素。
  • ans.erase(ans.begin()); 将最小元素删除,ans.insert(lower_bound(ans.begin(), ans.end(), arr[i]), arr[i])将原始数组中大于ans[0]的元素插入到新数组中。插入时,使用lower_bound在新数组中寻找插入位置,保证新数组也按从大到小的顺序排列。
总结

使用C++实现原始顺序查找数组的k个最大元素的方法很简单,在数据量较小的情况下可以使用。希望本文能对大家了解这种算法有所帮助。