🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 数组中的`k`个最大(或最小)元素| 添加了最小堆方法 > 原文: [https://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/](https://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/) **问题**:编写一个有效的程序来打印数组中 k 个最大的元素。 数组中的元素可以按任何顺序排列。 例如,如果给定的数组为`[1, 23, 12, 9, 30, 2, 50]`,并且要求您输入最大的 3 个元素,即`k = 3`,则程序应输出 50、30 和 23。 **方法 1(使用冒泡`k`次)** 感谢 Shailendra 提出了这种方法。 1)修改[冒泡排序](https://www.geeksforgeeks.org/bubble-sort/),最多可运行`k`次外部循环。 2)打印在步骤 1 中获得的数组的最后`k`个元素。 时间复杂度:`O(nk)` 像冒泡排序一样,其他排序算法(例如[选择排序](http://en.wikipedia.org/wiki/Selection_sort))也可以修改以获取`k`个最大元素。 **方法 2(使用临时数组)** 来自`arr[0..n-1]`的`K`个最大元素 1)将前`k`个元素存储在临时数组`temp[0..k-1]`中。 2)在`temp[]`中找到最小的元素,让最小的元素为`min`。 3-a)对于`arr[k]`至`arr[n-1]`中的每个元素`x`(`O(n-k)`), 如果`x`大于最小值,则从`temp[]`中删除`min`并插入`x`。 3-b)然后,从`temp[]`确定新的`min`(`O(k)`)。 4)打印`temp[]`的最后`k`个元素 时间复杂度:`O((n-k) * k)`。 如果我们要对输出进行排序,则`O((n-k) * k + klogk)` 感谢 nesamani1822 建议使用此方法。 **方法 3(使用排序)** 1)在`O(nLogn)`中按降序对元素进行排序 2)打印已排序数组`O(k)`的前`k`个数字。 以下是以上的实现。 ## C++ ```cpp // C++ code for k largest elements in an array #include <bits/stdc++.h> using namespace std; void kLargest(int arr[], int n, int k) {     // Sort the given array arr in reverse     // order.     sort(arr, arr + n, greater<int>());     // Print the first kth largest elements     for (int i = 0; i < k; i++)         cout << arr[i] << " "; } // driver program int main() {     int arr[] = { 1, 23, 12, 9, 30, 2, 50 };     int n = sizeof(arr) / sizeof(arr[0]);     int k = 3;     kLargest(arr, n, k); } // This article is contributed by Chhavi ```