码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2020-05-13 23:40:22      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:class   vat   使用   else   切分   wap   置换   一个   个数   

    //判断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));
    }

  

快速排序

标签:class   vat   使用   else   切分   wap   置换   一个   个数   

原文地址:https://www.cnblogs.com/hejunhong/p/12885361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!