快排基本原理
基本步骤
①首先定义第一个数作为基准数
②然后定义两个游标,i游标指向数组第一个,j游标指向数组最后一个
③让j游标找比当前基准数小的,找到后停下来
④让i游标找比当前基准数大的,找到后停下来
⑥相遇之后,让相遇位置的数和基准数互换
一轮下来,让一个数变的有序
递归的过程
- 该排序采用递归的方式实现
- 拆分的过程就是一个递归的过程
- 递归结束的状态就是叶子节点的状态(left = right)
为什么要让j游标先动【注意一定要让基准数对面的哨兵先移动】
如果选取最左边的数arr[left]作为基准数,那么先从右边开始可保证i,j在相遇时,相遇数是小于基准数的,交换之后base所在位置的左边都小于base。但先从左边开始,相遇数是大于基准数的,无法满足base左边的数都小于它。所以进行扫描,要从基准数的对面开始。
注意while循环嵌套while循环的执行方式
当满足内外循环的条件时,开始执行内循环【注意这里外层while循环的条件只执行了一次】,内循环结束,再次判断外循环条件,决定是否继续执行循环。
上源码!
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[] {8,5,4,3,6,89,0,6};
quickSort(arr,0,arr.length-1,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int left,int right,int i ,int j){
if(left>=right){
return;
}
//定义第一个数为基准数
int base = arr[left];
i = left;
j = right;
while(i != j) {
//j游标找到比当前基准数小的停下来
while(arr[j]>=base && i<j) {
j--;
}
// i游标要去找比当前基准数大的停下啦
while (arr[i]<=base && i<j) {
i++;
}
//交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// i和 j相遇 ,基准数和相遇位置的数进行交换
arr[left] = arr[i];
arr[i] = base;
quickSort(arr,left,i-1,i,j);
quickSort(arr,i+1,right,i,j);
}
}