java算法_快速排序


    public static void main(String[] args) {
        int[] arr = { 5,2,4,9,7 };  //创建要排序的数组
        sort(arr, 0, arr.length - 1);//数组的两端下标,和数组,调用排序逻辑方法
    }
    public static void sort(int arr[], int low, int high) {//静态方法,main方法中可以直接调用
        int l = low;//接收入参的最小下标
        int h = high;//接收入参数组的最大下标
        int k = arr[low];//入参最小下标的值

        while (l < h) {//如果最小下标的数字小于最大下标,执行while循环:从最大下标的数字一个一个和为0下标的比较
            // 从后往前比较
            //循环前:l==0  h==4(arr.length - 1)  arr[h]从大到小的数字   K 下标0的数字
            while (l < h && k<=arr[h] ) { // 如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
                //如果下标0的数字大于从大到小排序的,记录查询的h的下标,h值等于下标值
                h--;// h=6
            }
            System.out.println(h);
            if (l < h) {//while循环得到要替换的h值,这边做个替换,其实这个if里的判断没什么卵用,为了防止多执行,用for也可以改一下格式
                int temp = arr[h];//比第一个值小的值赋值给temp
                arr[h] = arr[l];//把下标l 位置的值放在下标h的位置上
                arr[l] = temp;//下标h位置的值放在l下标上
                //进行过一次替换后,没必要将替换后的两值再次比较,所以i++直接下一位与k对比
                l++;//l让后移动一个位置
            }
            // 从前往后比较,保留最大的
            while (l < h && k>=arr[l] ) { // 如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
                l++;
            }
            if (l < h) {
                int temp = arr[h];//最右边数字保存到变量中
                arr[h] = arr[l];//从左比较比h下标大的数,放在h下标上
                arr[l] = temp;//l下标的数与最右边的互换
                h--;//最大下标-1
            }
            // 此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
        }
        // 递归
        if (l > low)//先判断l>low再次经行左边排序
            sort(arr, low, l - 1);// 左边序列。第一个索引位置到关键值索引-1
        if (h < high)//左边依次排序执行完递归后,弹栈进行右边排序
            sort(arr, l + 1, high);// 右边序列。从关键值索引+1到最后一个
    }

你可能感兴趣的:(java算法_快速排序)