package com.interview.leetcode.binarysearch;
import com.interview.utils.ArrayUtil;
import java.util.Random;
/**
* Created_By: stefanie
* Date: 14-11-14
* Time: 下午8:11
*/
public class SearchingUnsortedArray {
static Random RAND = new Random();
public static boolean find(int[] array, int target){
return find(array, target, 0, array.length - 1);
}
private static boolean find(int[] array, int target, int low, int high){
if(low > high) return false;
int pivot = low;
//if(high - low > 0) pivot = low + RAND.nextInt(high - low); //random select one between low ~ high.
if(array[pivot] == target) return true;
pivot = partition(array, low, pivot, high);
if(target < array[pivot]) return find(array, target, low, pivot - 1);
else return find(array, target, pivot + 1, high);
}
private static int partition(int[] array, int low, int pivot, int high){
ArrayUtil.swap(array, low, pivot);
int i = low;
for(int j = low + 1; j <= high; j++){
if(array[j] < array[low]) ArrayUtil.swap(array, j, ++i);
}
ArrayUtil.swap(array, low, i);
return i;
}
public static int topK(int[] array, int k){
return topK(array, k, 0, array.length - 1);
}
private static int topK(int[] array, int k, int low, int high){
if(low > high) return -1;
int pivot = low;
//if(high - low > 0) pivot = low + RAND.nextInt(high - low); //random select one between low ~ high.
pivot = partition(array, low, pivot, high);
if(pivot == k) return array[pivot];
else if(pivot > k) return topK(array, k, low, pivot - 1);
else return topK(array, k, pivot + 1, high);
}
}