编辑代码

public class exper_QuickSort {
    public static void main(String[] args) {
        int[] arr = {3,4,1,7,2,5,11,8};
        int arrEnd = arr.length;
        quickSort(arr, 0, arrEnd);
        printArray(arr);
    }

    public static void quickSort(int[] arr, int arrStart, int arrEnd){
        int arrLen = arrEnd - arrStart;
        if (arrLen < 0){
            return;
        }
        if (arrLen == 0 || arrLen == 1){
            return;
        }

        //基准值
        int pivot = findPivot(arr, arrStart, arrEnd);
        //找出排序后基准值的位置,并将左右两个数组排序
        int pivotOrdered = partition(arr, arrStart, arrEnd, pivot);

        //左右两个数组继续排序
        quickSort(arr, arrStart, pivotOrdered);

        quickSort(arr,pivotOrdered+1, arrEnd);

    }

    private static int partition(int[] arr, int arrStart, int arrEnd, int pivot) {
        int arrLen = arrEnd - arrStart;
        if (arrLen == 1 || pivot < arrStart || pivot >= arrEnd){
            return -1;
        }
        //把基准值放在最后一位,避免数组不连续
        int pivotValue = arr[pivot];
        arr[pivot] = arr[arrEnd - 1];

        //记录左边数组的个数
        int indexCount = 0;

        for (int i = arrStart; i < arrEnd - 1; i++){
        //找出比基准值小的数据,并放在最左边
            if (arr[i] < pivotValue){
                int temp = arr[arrStart + indexCount];
                arr[arrStart + indexCount] = arr[i];
                arr[i] = temp;
                indexCount++;
            }
        }

        // 将基准值放在对应的位置
        arr[arrEnd - 1] = arr[arrStart + indexCount];
        arr[arrStart + indexCount] = pivotValue;
        //将基准值位置返回
        return arrStart + indexCount;
    }

    //返回基准值
    public static int findPivot(int[] arr, int arrStart, int arrEnd){
        return arrStart;
    }

    //打印数组
    public static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

}