How to Find k largest(or smallest) elements in an array?
Question: Write an efficient program for printing k largest elements in an array. Elements in an array can be in any order.
For
example, if the 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)
1) Modify Bubble Sort to run the outer loop at most k times.
2) Print the last k elements of the array obtained in step 1.
Time Complexity: O(n*k)
Like Bubble sort, other sorting algorithms like Selection Sort can also be modified to get the k largest elements.
Method 2 (Use temporary array)
K largest elements from arr[0..n-1]
1) Store the first k elements in a temporary array temp[0..k-1].
2) 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)
4) Print final k elements of temp[]
Time Complexity: O((n-k)*k). If we want the output sorted then O((n-k)*k + k*log(k))
Method 3(Use Sorting)
1) Sort the elements in descending order in O(n*log(n))
2) Print the first k numbers of the sorted array O(k).
Following is the implementation of the above.
CODE :
// 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); } |