zoukankan      html  css  js  c++  java
  • 快速排序

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

      

  • 相关阅读:
    TensorFlow进行简单的图像处理
    Python Numpy
    Python描述性统计
    对文件和文件夹操作的简单函数
    Tensorflow最简单的图像搭建识别系统
    Python大数据处理模块Pandas
    redis 小结
    datatable 和list 互转
    List集合去重的一种方法
    C#中TransactionScope的使用方法和原理
  • 原文地址:https://www.cnblogs.com/hejunhong/p/12885361.html
Copyright © 2011-2022 走看看