分区相连的快速排序指的是,Partition后的两个分区是相连的, 在这种分区方式中,partition后数组被分为连续的左右两段,再递归地进行排序,这两段需要保证以下关系成立:
partition[left...partitionIndex] <= partition[partitionIndex + 1, right]
由于这两半分区是相连的,所以当左边或者右边的分区是空的时候,就会进入死循环,例如下面这种实现:
1 一种导致死循环的错误实现
public static void quickSort(int[] a, int left, int right) {
if (right <= left) {
return;
}
int pivotIndex = left + new Random().nextInt(right - left);
int divideIndex = partition(a, left, right, pivotIndex);
assert divideIndex != left - 1 : "Error: a[left...divideIndex] is empty";
assert divideIndex != right : "Error: a[divideIndex + 1...right] is empty";
quickSort(a, left, divideIndex);
quickSort(a, divideIndex + 1, right);
}
private static int partition(int[] a, int left, int right, int pivotIndex) {
int pivotValue = a[pivotIndex];
int i = left, j = right;
while (i <= j