/**
* more efficient implements for quicksort. <br />
*/
public class Quicksort {
public static final Random RND = new Random();
//public static final int CUTOFF = 0;
/**
* internal method to sort the array with quick sort algorithm. <br />
*
* @param arr
* an array of Comparable Items. <br />
* @param left
* the left-most index of the subarray. <br />
* @param right
* the right-most index of the subarray. <br />
*/
public static void sort(int arr[], int left, int right) {
if (left >= right)
return;
// start partitioning
int index = partition(arr, left, right);
sort(arr, left, index - 1);// sort the left collection.
sort(arr, index + 1, right);// sort the right collection
}
/**
* the partition of an array
* @param arr the array to be sorted<br />
* @param start
* the left position. <br />
* @param right
* the right position. <br />
* @return partition random partition between left and right
*/
private static int partition(int arr[], int left, int right) {
int index = randint(left, right);
// find the pivot
int pivot = arr[index];
swap(arr, index, right);
for (int i = index = left; i < right; i++)
if (arr[i] < pivot)
swap(arr, index++, i);
swap(arr, right, index);
return index;
}
/**
* method to swap references in an list.<br />
*
* @param <T>
*
* @param arr
* an array of Objects. <br />
* @param idx1
* the index of the first element. <br />
* @param idx2
* the index of the second element. <br />
*/
public static void swap(int[] arr, int idx1, int idx2) {
if (idx1 != idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
}
public static int randint(int left, int end) {
return left + RND.nextInt(end - left + 1);
}