Hello Everyone,
Question: Write an efficient program for printing k largest elements in an array. Elements in array can be in any order.
For example, if given array is [1, 23, 12, 9, 30, 2, 50] and you are asked for the largest 3 elements i.e., k = 3 then your program should print 50, 30, and 23.
Method 1 (Use Bubble k times)
- Modify Bubble Sort to run the outer loop at most k times.
- Print the last k elements of the array obtained in step 1.
Time Complexity: O(nk)
Method 2 (Use temporary array)
K largest elements from arr[0…n-1]
- Store the first k elements in a temporary array temp[0…k-1].
- Find the smallest element in temp[], let the smallest element be min .
3-a) For each element x in arr[k] to arr[n-1]. O(n-k)
If x is greater than the min then remove min from temp[] and insert x .
3-b)Then, determine the new min from temp[]. O(k) - Print final k elements of temp[]
Time Complexity: O((n-k)*k). If we want the output sorted then O((n-k)*k + klogk)
Thanks to nesamani1822 for suggesting this method.
Method 3(Use Sorting)
- Sort the elements in descending order in O(nLogn)
- Print the first k numbers of the sorted array O(k).
Following is the implementation of the above.
// 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);
}
Output
50 30 23
Time complexity: O(nlogn)
Method 4 (Use Max Heap)
- Build a Max Heap tree in O(n)
- Use Extract Max k times to get k maximum elements from the Max Heap O(klogn)
Time complexity: O(n + klogn)
Method 5(Use Order Statistics)
- Use order statistic algorithm to find the kth largest element.
- Use QuickSort Partition algorithm to partition around the kth largest number O(n).
- Sort the k-1 elements (elements greater than the kth largest element) O(kLogk). This step is needed only if sorted output is required.
Time complexity: O(n) if we don’t need the sorted output, otherwise O(n+kLogk)