/**
* @param arr 需要排序的数组
* @param l 数组最左下标
* @param r 数组最右下标
*/
public static void quickSort(int[] arr, int l, int r) {
if (l >= r) {// 相等的时候即为只剩一个元素,一个元素是有序的
return;
}
int pivotIndex = partition(arr, l, r);// 实现了对子数组的原址重排,并且返回对应的主元下标
quickSort(arr, pivotIndex + 1, r);
quickSort(arr, l, pivotIndex - 1);
}
/**
* @param arr 原排序数组
* @param l 子数组数组最左下标
* @param r 子数组数组最右下标
* @return 主元下标 pivotIndex
*/
private static int partition(int[] arr, int l, int r) {
int pivot = arr[r];
int t;// 用作交换的变量
int i = l - 1;// 指针i
int j = l;// 指针j
for (; j < r; j++) {// j负责遍历数组
if (arr[j] < pivot) {
i++;
if (i != j) {// 优化,体现稳定性,可有可无
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
i++;
if (i < r) {// 交换主元位置
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
return i;
}