举例: 数组[10,4,3,4,8,9,0,1]:
红色指针指的是起点,蓝色是终点,绿色是需要作为枢轴的节点。
第一轮后:
第一轮排序后,节点4已经到达最终位置。
第二轮左半边后:
节点0已经到达最终位置。
第二轮右半边后:
节点9已经到达最终位置。
第三轮:
对于左半边[0,1,3]的左递归[0]:节点0已经到达最终位置,是本身[0]。
对于左半边[0,1,3]的右递归[1,3]:节点1已经到达最终位置,是本身[1,3]。
对于右半边[8,4,9,10]的左递归[8,4]:节点8是已经到达最终位置,是[4,8]。
对于右半边[8,4,9,10]的右递归[9,10]:节点9到达最终位置,是[9,10]。
按理来说:此时已经有序。但递归还没结束。
第四轮:
对于[0]的两个子递归,达到start >= end了,于是return。
之后的几个递归分支,也是如上的形式到最后的return,后续的轮次过程与上述类似。
private static void quickSort(int[] arr, int start, int end){
if(start >= end){
return;
}
int left = start, right = end;
int pivot = arr[(start + end) >> 1];
while(left <= right){
//要找大的去交换,遇见小的就往后走
while(left <= right && arr[left] < pivot){
left++;
}
//要找小的去交换,遇见大的就往前走
while(left <= right && arr[right] > pivot){
right--;
}
if(left <= right){
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
//交换之后,分别朝原方向继续走
left++;
right--;
}
}
quickSort(arr, start, right);
quickSort(arr, left, end);
}