/**
* 二路快排
* @param arr
*/
public static void quickSort2(int[] arr) {
quickSortInternal2(arr, 0, arr.length - 1);
}
/**
*
* @param arr
* @param l
* @param r
*/
private static void quickSortInternal2(int[] arr, int l, int r) {
if(r - l <= 15) {
insertBase(arr, l, r);
return;
}
int p = partition2(arr, l, r);
quickSortInternal2(arr, l, p - 1);
quickSortInternal2(arr, p + 1, r);
}
/**
*
* @param arr
* @param l
* @param r
* @return
*/
private static int partition2(int[] arr, int l, int r) {
int randomIndex = random.nextInt(l, r);
swap(arr, l, randomIndex);
int v = arr[l];
//arr[l + 1...i) < v
int i = l + 1;
//arr(j...r] > v
int j = r;
while(true) {
//i从前向后扫描碰到第一个 >= v 的元素停止
while (i <= r && arr[i] < v) {
i++;
}
//j从后向前扫描,碰到第一个 <= v 的元素停止
while(j >= l + 1 && arr[j] > v) {
j--;
}
if(i > j) {
//此时整个数组已经全部扫描完毕
break;
}
swap(arr, i, j);
i++;
j--;
}
//此时j落在最后一个 <= v的元素
swap(arr, l, j);
return j;
}