快速排序代码:
class MyQuickSort {
public void quickSort(int[] arr,int low,int high){
if (low >= high) {
return;
}
//基准元素为数组第一个值
int pivot = arr[low];
//左索引
int left = low;
//右索引
int right = high;
while(left < right){
//先从右边开始判断
while(left < right && pivot <= arr[right]){
right--;
}
while(left < right && arr[left] <= pivot){
left++;
}
//交换元素
if(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
//索引元素和基准元素交换
arr[low] = arr[right];
arr[right] = pivot;
quickSort(arr,low,right-1);
quickSort(arr,right+1,high);
}
}
while循环中,为什么要先判断基准的右边从最大索引开始而不能从基准的左边开始判断,从0索引开始呢?
也就是while循环中
while(left < right && pivot <= arr[right]){
right--;
}
while(left < right && arr[left] <= pivot){
left++;
}
两块代码位置能不能替换
先定义一个数组
int[] arr = {8,1,9,17,91,19};
如果我们先从左边开始判断
left指针指向元素9时,指针就会停止
然后右指针开始判断,同样指向9时会停止
此时 left 指针和 right 指针相等,那么就会跳出while循环,指针指向的元素会和首元素交换
此时数组就会变成
int[] arr = {9,1,8,17,91,19};
显然这样做是错误的,基准元素8的左边存在比基准元素大的元素
这是因为我们先从左边开始查找,首先找到的是比基准元素大的元素。这个元素不会被交换到右边,而是与基准进行交换。交换后就会导致错误。
如果我们先从右边开始判断比基准小的元素,那么首先找到的是比基准小的元素。在这个例子中就是元素1,接下来再进行基准元素交换,数组就会变成下面这样。
int[] arr = {1,8,9,17,91,19};
这样交换才正确。总的来说就是首先找到元素是比基准元素大还是比基准元素小,对应就是先从右边开始还是先从左边开始的问题。