关于 Java快速查找详细

复制代码
package V_Recursion;

public class C_QuickSort {
    public static void main(String[] args) {
        int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
        quicSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " , ");
        }
    }

    public static void quicSort(int[] arr, int i, int j) {
        //定义两个变量,记录要查找的范围
        int start = i;
        int end = j;

        //递归的出口
        if (start>end){
            return;
        }

        //记录基准数
        int baseNumber = arr[i];

        //利用循环找到要交换的数字
        while (start != end) {
            //利用end,从后往前找,找比基准数小的数字
            while (true) {
                
                //当end和star的指针指向重叠时,或者后指针找到了比基准数小的数时break
                if (end <= start || arr[end] < baseNumber) {
                    break;
                }
                end--;
            }

            //利用start,从前往后找,比基准数大的数字
            while (true) {
                //当end和star的指针指向重叠时,或者前指针找到了比基准数大的数时break 
                if (end <= start || arr[start] > baseNumber) {
                    break;
                }
                start++;

            }

            //把end和start指向的元素交换
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        //当start和end指向同一个元素,那么上面的循环就会结束
        //表示找到了基准数在数组中因该存在的位置
        //基准数归位
        //就是拿着这个范围中的第一个数字跟start交换位置
        int temp = arr[start];
        arr[start] = arr[i];
        arr[i] = temp;

        //确定6左边的范围重复刚刚所做的事情
        quicSort(arr,i,start-1);

        //确定6右边的范围重复刚刚的事情
        quicSort(arr,start+1,j);

    }
}