package com.atguigu.sort;
import java.util.Arrays;
/**
* @author
* @create 2022-06-03-15:51
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = {-9, 78, 0, 23, -567, 70,554,-4,65,487,0};
System.out.println("排序前:" + Arrays.toString(arr));
quickSort(arr, 0, 5);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
int l = left;//左索引值
int r = right;//右索引值
int pivot = arr[(left + right) / 2];//中间值
int temp;//临时变量,用于交换
//直到l>=r时才退出这个循环
while (l < r) {
//左边的值小于中间值,l继续向后,此循环退出时,l指向一个大于等于中间值的数
while (arr[l] < pivot) {
l += 1;
}
//右边的值大于中间值,r继续向前,此循环退出时,r指向一个小于等于中间值的数
while (arr[r] > pivot) {
r -= 1;
}
//如果l>=r,说明pivot左侧全是比它小的数,右侧全是比它大的数,感觉没必要
// if (l >= r) {
// break;
// }
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//交换完后,如果发现左侧l对应的值为pivot,则l++,向后移动
if (arr[l] == pivot) {
l += 1;
}
//交换完后,如果发现右侧r对应的值为pivot,则r--,向前移动
if (arr[r] == pivot) {
r -= 1;
}
}
if (l == r) {//如果l==r,必须让l++,r--,否则会出现栈溢出
l += 1;
r -= 1;
}
//开始递归
//左侧递归
if (left<r){
quickSort(arr,left,r);
}
//右侧递归
if (l<right) {
quickSort(arr,l,right);
}
}
}
数据结构学习(韩顺平)之快排
最新推荐文章于 2022-12-11 11:42:31 发布