import java.util.Arrays;
class Main {
public static void main(String[] args) {
//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
int[] arr = new int[]{2,6,1,-3,8,0,9,12};
quickSort(arr,0,arr.length - 1);
System.out.println(Arrays.toString(arr));
}
//快速排序的代码演示
public static void quickSort(int[] arr,int left, int right){
int l = left,r = right;//首先存储最左边和最后边的值
//pivot作为数组中的中轴值,左右两边的值以pivot为界限做交换准备
int pivot = arr[(left + right) / 2];
int temp = 0;//数据交换的临时变量
while(l < r){//再l小于r的情况下无限遍历,寻找下标进行交换
while(arr[l] < pivot){//再arr[l]大于pivot之前,不断寻找大于pivot的值
l++;
}
while(arr[r] > pivot){//再arr[r]小于pivot之前,不断寻找小于pivot的值
r--;
}
if(l >= r){//如果成立,则说明所有的数据都交换完成
break;
}
//开始交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//判断l下标是否等于中轴值,成立r--
if(arr[l] == pivot){r--;}
//判断r下标是否等于中轴值,成立l--
if(arr[r] == pivot){l++;}
}
//如果l == r
if(l == r){
l++;
r--;
}
//做中轴值左边排序的回溯条件
if(left < r){
quickSort(arr,left,r);
}
//做中轴值右边排序的回溯条件
if(right < l){
quickSort(arr,l,right);
}
}
public static void quickSort1(int[] arr,int left,int right){
int l = left,r = right;//左下标和右下标
//pivot中轴值
int pivot = arr[(left + right) / 2];
int temp = 0;//作为交换的临时变量
while(l < r){//让比pivot值小的放到它的左边,比pivot值大的放到它的右边
//在pivot的左边一直找,找到大于等于pivot的值,才退出
while(arr[l] < pivot){
l++;
}while(arr[r] > pivot){
r--;
}
//如果l >= r说明pivot的左右值已经按照左边全部是小于等于pivot的值,右边全部是大于等于pivot的值
if(l >= r){
break;
}
//交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交换完后,发现arr[l] == pivot的值,将l--
if(arr[l] == pivot){
r--;
}
//如果交换完后,发现arr[r] == pivot的值,将r++
if(arr[r] == pivot){
l++;
}
}
//如果l == r,必须l++,r--,否则会出现栈溢出
if(l == r){
l++;
r--;
}
//向左递归
if(left < r){
quickSort(arr,left,r);
}
//向右递归
if(right > l){
quickSort(arr,l,right);
}
}
}