zoukankan      html  css  js  c++  java
  • 基于分治思想的快速排序

    1、主要思想
    • 根据一个基准数,通常是第一个数,把比这个数大的放在右边,比这个数小的放在左边。这样一个序列就被基准数一分为二。
    • 再分别对左右两个序列选取基准数,执行上面同样的逻辑,继续拆分,直到划分为序列只有一个元素或零个元素即为有序。
    2、代码实现
    package com.hncj.daily;
    
    import java.util.Arrays;
    
    public class QuickSort {
        public static void main(String[] args) {
            int[] arr = new int[]{1, 2, 3, 8, 8, 7, 13, 11, 22, 19};
            divide(arr, 0, arr.length - 1);
            Arrays.stream(arr).forEach(item -> System.out.println(item));
        }
    
        /**
         * 将一个无序序列划分为两个无序序列
         * @param arr
         * @param start
         * @param end
         * @return
         */
        public static int partition(int[] arr, int start, int end) {
            //以第一个数为基准
            int base = arr[start];
            while (start != end) {
                //从右往左找找到第一个比基准小的放在arr[start]的位置
                while (start < end && arr[end] >= base) {
                    end--;
                }
                arr[start] = arr[end];
                //从左往右找到第一个比基准大的放在arr[end]的位置
                while (start < end && arr[start] <= base) {
                    start++;
                }
                arr[end] = arr[start];
            }
            //此时start=end,start便是基准的位置,基准左边的数都比基准小,基准右边的数都比基准大
            arr[start] = base;
            return start;
        }
    
        /**
         * 分治的思想进行快速排序
         * @param arr
         * @param start
         * @param end
         */
        public static void divide(int[] arr, int start, int end) {
            //序列中至少有两个元素才进行划分,一个或零个元素即为有序
            if (start < end) {
                //根据一个基准将序列划分为两个无序序列
                int index = partition(arr, start, end);
                //再将左边的序列继续划分
                divide(arr, start, index - 1);
                //将右边的序列划分
                divide(arr, index + 1, end);
            }
        }
    }
    
    3、一点思考
    • 可以总结出快排的口诀

    小的往左放,大的往右放

    • 为什么要从右往左扫描一次,然后从左往右扫描一次,而不是单向扫描?

    为的是大数有机会放置到右边,小数有机会放置在左边,如果是一直单向扫描,会导致数值在放置过程中被覆盖丢失。

  • 相关阅读:
    npm install 错误 | gyp ERR! configure error
    AD中鼠标经过PCB走线或元器不能高亮显示连线的解决办法
    浏览器提示TLS版本过低, 要求升到TLS1.2或TLS1.3的一些问题收录
    Java.报错:The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    Centos.安装Goaccess1.2
    Mongoose多数据库连接及实用样例
    mongodb通过profile来监控数据
    mongodb副本集 statestr状态说明/解释
    mongodb.副本集配置方法(使用keyfile认证部署)
    vsftp安装与配置for Linux
  • 原文地址:https://www.cnblogs.com/wotoufahaiduo/p/11682043.html
Copyright © 2011-2022 走看看