编辑代码

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);
		}
	}
}