package com.jwetherell.algorithms.search;
import java.util.Random;
/**
* In computer science, quickselect is a selection algorithm to find the k-th smallest element in an unordered list. It is related to the quicksort sorting algorithm.
*
* Worst-case performance О(n2)
* Best-case performance О(n)
* Average performance O(n)
*
* https://en.wikipedia.org/wiki/Quickselect
*
* @author Justin Wetherell
*/
public class QuickSelect {
private static final Random RANDOM = new Random();
private static int[] unsorted = null;
private static int[] temp = null;
public static final int find(int value, int[] array) {
unsorted = array;
temp = new int[unsorted.length];
try {
int tempLength = unsorted.length;
int length = tempLength;
int pivot = unsorted[0];
while (length > 0) {
length = tempLength;
pivot = unsorted[RANDOM.nextInt(length)];
tempLength = 0;
for (int i = 0; i < length; i++) {
int iValue = unsorted[i];
if (value == iValue)
return i;
else if (value > pivot && iValue > pivot)
temp[tempLength++] = iValue;
else if (value < pivot && iValue < pivot)
temp[tempLength++] = iValue;
}
unsorted = temp;
length = tempLength;
}
return Integer.MAX_VALUE;
} finally {
QuickSelect.unsorted = null;
QuickSelect.temp = null;
}
}
}