快速排序

Posted hejunhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

    //判断a是否小于b
    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }

    //两个交换
    private static void swap(Comparable arr[], int i, int j) {
        Comparable tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    //进行数组中的排序
    private static void sort(Comparable arr[]) {
        //第一个数的索引
        int low = 0;
        //最后一个数的索引
        int high = arr.length - 1;
        sort(arr, low, high);

    }

    //对arr数组中  low到high进行排序
    private static void sort(Comparable arr[], int low, int high) {
        //要排序的子数组,low比high都大了 说明 该数组只剩一个值,无法在交换了
        if (high<=low){
            return;
        }
        //需要对数组中low-high 中的元素进行分组,分为左子组,右子组
        int partition = partition(arr, low, high); //返回分界的那个值的索引
        //让左子组有序
        sort(arr, low, partition - 1);
        //让右子组有序
        sort(arr, partition + 1, high);
    }

    //进行分组的方法
    private static int partition(Comparable arr[], int low, int high) {
        //确定分界值
        Comparable key = arr[low];
        //定义两个指针,指向待切分数组的最小索引和最大索引
        int left = low;
        int right = high + 1;
        //切分 需要进行扫描 扫描多少次呢 使用
        while (true) {
            //先从右往左扫描,移动right指针,找到一个比分界值小的元素,停止
            //元素比分界大,不是目标元素,指针就一直左移,
            while (less(key, arr[--right])) {
                //如果到了最左边也没找到,退出
                if (right == low) {
                    break;
                }
            }
            //在从左往右扫描,移动left指针,找到一个比分界值大的元素,停止
            //向右移动 找比key大的值
            while (less(arr[++left], key)) {
                //如果到了最左边也没找到,退出
                if (left == high) {
                    break;
                }
            }
            //判断left》=right,如果是 元素扫描完毕结束循环
            if (left >= right) {
                //说明扫描完毕了
                break;
            } else {
                //没有扫描完,说明 比key 大的和比key小的 都需要交换位置
                swap(arr, left, right);
            }
        }
        //整个循环结束 找到了分界值的索引 ,将基准与分界值的位置换掉,交换分界值
        swap(arr, low, right);
        return right;
    }

    public static void main(String[] args) {
        Integer[] integers= {6, 1, 2, 7, 9, 3, 4, 5, 8};
       sort(integers);
        System.out.println(Arrays.toString(integers));
    }

  

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

代码片段如何使用CSS来快速定义多彩光标

vs2003:快速片段工具