package me.ramswaroop.arrays;
import me.ramswaroop.arrays.sorting.MergeSort;
import me.ramswaroop.common.MaxHeap;
import java.util.Arrays;
/**
* Created by IntelliJ IDEA.
*
* @author: ramswaroop
* @date: 8/1/15
* @time: 11:26 PM
*/
public class KthLargestElement {
/**
* Naive approach.
* <p/>
* Time complexity: O(n log n)
*
* @param a
* @param k
* @return
*/
public static int getKthLargestElementNaive(int[] a, int k) {
if (k >= a.length) return -1;
a = MergeSort.mergeSort(a);
return a[a.length - k];
}
/**
* Determines the kth largest element by building a max heap
* k times removing the root each time.
*
* @param a
* @param k
* @return
*/
public static int getKthLargestElement(int[] a, int k) {
MaxHeap maxHeap = new MaxHeap(a);
maxHeap.buildMaxHeap();
while (true) {
if (k == 1) break;
maxHeap.extractMax();
k--;
}
return maxHeap.findMax();
}
private static void swap(int[] a, int firstIndex, int secondIndex) {
a[firstIndex] = a[firstIndex] + a[secondIndex];
a[secondIndex] = a[firstIndex] - a[secondIndex];
a[firstIndex] = a[firstIndex] - a[secondIndex];
}
public static void main(String a[]) {
int[] ar = new int[]{2, 4, 5, 7, 1, 8, 9};
System.out.println(Arrays.toString(ar));
System.out.println(getKthLargestElementNaive(ar, 3));
System.out.println(Arrays.toString(ar));
System.out.println(getKthLargestElement(ar, 3));
System.out.println(Arrays.toString(ar));
}
}