Find k maximum elements of array in original order

Given an array arr[] and an integer k, we need to print k maximum elements of given array. The elements should printed in the order of the input.

Note : k is always less than or equal to n.

Examples:

Input : arr[] = {10 50 30 60 15}
        k = 2
Output : 50 60
The top 2 elements are printed
as per their appearance in original
array.

Input : arr[] = {50 8 45 12 25 40 84}
            k = 3
Output : 50 45 84


Method 1: We search for the maximum element k times in the given array. Each time we find one maximum element, we print it and repalce it with minus infinite (INT_MIN in C) in the array. The time complexity of this method is O(n*k).

Method 2: In this method, we store the original array in a new array and will sort the new array in descending order. After sorting, we iterate the original array from 0 to n and print all those elements that appear in first k elements of new array. For searching, we can do Binary Search.

C++

// CPP program to find k maximum elements 
// of array in original order
#include <bits/stdc++.h>
using namespace std;

// Function to print m Maximum elements
void printMax(int arr[], int k, int n)
{
    // vector to store the copy of the
    // original array
    vector<int> brr(arr, arr + n);

    // Sorting the vector in descending
    // order. Please refer below link for
    // details
    // https:// www.geeksforgeeks.org/sort-c-stl/
    sort(brr.begin(), brr.end(), greater<int>());

    // Traversing through original array and
    // printing all those elements that are
    // in first k of sorted vector.
    // Please refer https:// goo.gl/44Rwgt
    // for details of binary_search()
    for (int i = 0; i < n; ++i)
        if (binary_search(brr.begin(),
                 brr.begin() + k, arr[i], 
                        greater<int>()))
            cout << arr[i] << " ";
}

// Driver code
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;
}

Java

// Java program to find k maximum  
// elements of array in original order
import java.util.Arrays;
import java.util.Collections;

public class GfG {
    
    // Function to print m Maximum elements
    public static void printMax(int arr[], int k, int n)
    {
        // Array to store the copy 
        // of the original array
        Integer[] brr = new Integer[n];
        
        for (int i = 0; i < n; i++)
        brr[i] = arr[i];
        
        // Sorting the array in 
        // descending order
        Arrays.sort(brr, Collections.reverseOrder());
    
        // Traversing through original array and
        // printing all those elements that are
        // in first k of sorted array.
        // Please refer https://goo.gl/uj5RCD
        // for details of Arrays.binarySearch()
        for (int i = 0; i < n; ++i)
            if (Arrays.binarySearch(brr, arr[i], 
                    Collections.reverseOrder()) >= 0
                 && Arrays.binarySearch(brr, arr[i], 
                    Collections.reverseOrder()) < k)
                    
                System.out.print(arr[i]+ " ");
    }

    // Driver code
    public static void main(String args[])
    {
        int arr[] = { 50, 8, 45, 12, 25, 40, 84 };
        int n = arr.length;
        int k = 3;
        printMax(arr, k, n);
    }
}

// This code is contributed by Swetank Modi


Output :

50 45 84 

Time Complexity : O(n Log n) for sorting.
Auxiliary Space : O(n)





Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Recommended Posts:



2.1 Average Difficulty : 2.1/5.0
Based on 11 vote(s)