public static void main(String[] args) {
/**
* 快排有几个关注点
* 1:查找基准点,假设基准点左侧的元素均小于基准元素,基准右侧的元素均大于基准元素
* 2:会选择两个指针一个指针从左向右移动,另外一个指针从右向左侧移动,如果右侧指针元素大于基准元素,则右侧指针左移,如果左侧指针元素小于基准元素,左侧指针右移
* 3:当左侧指针和右侧指针相同的时候说明移动完成,交换基准元素和该位置的值即可,此时完成基准元素左侧的值均小于基准,右侧的值均大于基准
* 注意:
* * 必须先移动右侧指针,为了保证当左右指针一样的时候,因为是右侧指针先停止的,所以当left = right 的时候,arr[left] 是一定小于基准元素的。
* * 必须递归调用即自己调用自己,递归的停止条件是 left>=right
*/
int[] a = new int[]{5,8,11,9,2,56,0,1,99};
quickSort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
private static void quickSort(int[] arr, int start, int end) {
// 递归的停止条件是 left>=right
if(start >= end){
return;
}
// 查找基准元素
int base = findBaseIndex(arr,start,end);
// 递归分两部分排序
quickSort(arr,start,base-1);
quickSort(arr,base+1 ,end);
}
private static int findBaseIndex(int[] arr, int start, int end) {
//设置基准元素
int p = arr[start];
int left = start ;
int right = end ;
while (left < right){
// 先遍历右侧指针,
while (left < right && arr[right] >= p){
right -- ;
}
// 遍历左指针
while (left < right && arr[left] <= p){
left ++ ;
}
// 此时left > p && right < p 随机交换left 和right 即可满足 right >p and left < p
swap(arr,left,right);
}
// 此时left == right ,且满足 下标为left前的元素值均小于基准,下标大于left的均大于基准,交换基准和left
arr[start] = arr[left];
arr[left] = p ;
// 返回基准元素下标
return left;
}
private static void swap(int[] arr, int left, int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp ;
}