53 lines
1.7 KiB
Java
53 lines
1.7 KiB
Java
|
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.
|
|||
|
* <p>
|
|||
|
* Worst-case performance О(n2)<br>
|
|||
|
* Best-case performance О(n)<br>
|
|||
|
* Average performance O(n)<br>
|
|||
|
* <br>
|
|||
|
* https://en.wikipedia.org/wiki/Quickselect
|
|||
|
*
|
|||
|
* @author Justin Wetherell <phishman3579@gmail.com>
|
|||
|
*/
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|