public class QuickSortUtil { public static void sort(int[] array) { sort(array, 0, array.length - 1); } private static void sort(int[] array, int start, int end) { if (end - start <= 10) { insertSort(array, start, end); } else { int pivot = getPivot(array, start, end); int partion = partionArray(array, start, end, pivot); sort(array, start, partion - 1); sort(array, partion + 1, end); } } private static void insertSort(int[] array, int start, int end) { for (int out = start + 1; out <= end; out++) { int temp = array[out]; int in; for (in = out;in > start && array[in - 1] >= temp;in--) { array[in] = array[in - 1]; } array[in] = temp; } } private static int getPivot(int[] array, int start, int end) { int center = (start + end) / 2; if (array[start] > array[end]) { swap(array, start, end); } if (array[start] > array[center]) { swap(array, start, center); } if (array[center] > array[end]) { swap(array, center, end); } swap(array, center, end - 1); return array[end - 1]; } private static int partionArray(int[] array, int start, int end, int pivot) { int pl = start; int pr = end - 1; while (true) { while (array[++pl] < pivot); while (array[--pr] > pivot); if (pl >= pr) { break; } else { swap(array, pl, pr); } } swap(array, pl, pr - 1); return pl; } private static void swap(int[] array, int left, int right) { int temp = array[left]; array[left] = array[right]; array[right] = temp; }}