最近读《java常用算法》,对书中快排实现的逻辑解释如下
public static void quickSort(int[] arr, int left, int right) {
int f, t;
int rtemp, ltemp;
f = arr[(left + right) / 2];// 分界值
ltemp = left;
rtemp = right;
while (ltemp < rtemp) {
while (arr[ltemp] < f) { // 找到左边不小于分界值的数值位置 a
++ltemp; // 移动
}
while (arr[rtemp] > f) { // 找到右边不大于分界值的数值位置 b
--rtemp; // 移动
}
if (ltemp <= rtemp) { // 如果此时 a的位置在b位置左边 交换
t = arr[ltemp];
arr[ltemp] = arr[rtemp];
arr[rtemp] = t;
++ltemp; //继续移动左边
--rtemp; //继续移动右边
}
}
if (ltemp == rtemp) { //此处注释的话会少循环一次,但是书里有这个逻辑,暂时不明白为什么
ltemp++;
}
System.out.print("f:"+f+" ");
for (int i : arr) {
System.out.print(i + ",");
}
System.out.println();
if (left < rtemp) { //如果右边的指针没有移动到最左边 继续递归左边部分
quickSort(arr, left, ltemp - 1);
}
if (right > ltemp) {//如果左边的指针没有移动到最右边 继续递归右边部分
quickSort(arr, rtemp + 1, right);
}
}