package com.interview.array;
import java.util.Arrays;
/**
* Kth largest element in an array.
* Use quickselect of quicksort to find the solution in hopefully O(nlogn) time.
* Test cases
* Sorted array
* Reverse sorted array
*/
public class KthElementInArray {
public int kthElement(int arr[],int k){
int low = 0;
int high = arr.length-1;
int pos =0;
while(true){
pos = quickSelect(arr,low,high);
if(pos == (k+low)){
return arr[pos];
}
if(pos > k + low){
high = pos-1;
}else{
k = k - (pos - low + 1);
low = pos+1;
}
}
}
private int quickSelect(int arr[],int low,int high){
int pivot = low;
low++;
while(low <= high){
if(arr[pivot] > arr[low]){
low++;
continue;
}
if(arr[pivot] <= arr[high]){
high--;
continue;
}
swap(arr,low,high);
}
if(arr[high] < arr[pivot]){
swap(arr,pivot,high);
}
return high;
}
private void swap(int arr[],int low,int high){
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
public static void main(String args[]){
int arr[] = {6, 2, 1, 6, 8, 9, 6};
KthElementInArray kthElement = new KthElementInArray();
System.out.print(kthElement.kthElement(arr, arr.length/2));
System.out.print(Arrays.toString(arr));
}
}