package com.interview.basics.search.array.unsorted;
import com.interview.basics.search.array.ArraySearcher;
import java.util.Random;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 10/17/14
* Time: 4:50 PM
*/
public class QuickSelectSearcher<T extends Comparable<T>> extends ArraySearcher<T> {
static Random RAND = new Random();
public QuickSelectSearcher(T[] input) {
super(input);
}
@Override
public T find(T element) {
return find(element, 0, input.length - 1);
}
protected T find(T element, int low, int high){
if(low > high) return null;
findPivot(input, low, high);
T key = input[low];
if(element.equals(key)) return input[low];
int partition = partition(low, high);
if(element.compareTo(key) < 0) return find(element, low, partition - 1);
else return find(element, partition + 1, high);
}
protected void findPivot(T[] input, int low, int high) {
if(low == high) return;
int rand = low + RAND.nextInt(high - low); //random shuffle
if(rand != low) swap(input, rand, low);
}
protected int partition(int low, int high){
int i = low;
for(int j = low + 1; j <= high; j++)
if(input[j].compareTo(input[low]) < 0 && ++i != j) swap(input, i, j);
if(low != i) swap(input, low, i);
return i;
}
protected void swap(T[] input, int i, int j){
T temp = input[i];
input[i] = input[j];
input[j] = temp;
}
}