• 快速排序


    将一个数组分成两个子数组,子数组1的元素都小于等于v,子数组2的元素都大于等于v,v可取值为数组中的任意元素。

    在分别对子数组进行上述排序,直到子数组的元素个数为1,整个数组排序完成。

    数组切分

    该算法的关键在于数组切分,即选取切分元素v,使子数组1的元素都小于等于v,子数组2的元素都大于等于v。

    以下示例选取数组中的第一个元素a[lo]为切分元素

    实现代码如下:

        public static int partision(int[] a, int lo, int hi) {
    
            
            int i = lo+1;
            int j = hi;
            int v = a[lo];
            while(true) {
    
                // 从左向右扫描,寻找大于v的元素
                while(i<=j && a[i]<=v) i++;
                // 从右向左扫描,寻找小于v的元素
                while(i<=j && a[j]>=v) j--;
    
                // 交换a[i]与a[j]
                if(i<j) {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
                // 若i>=j,扫描完成
                // 交换a[lo]与a[j]
                else {
                    int temp = a[lo];
                    a[lo] = a[j];
                    a[j] = temp;
                    return j;
                }
            }
        }

    递归方法可实现整个快速排序,如下:

        public static void sort(int[] a, int lo, int hi) {
    
            if(hi<=lo) return;
            int j = partision(a, lo, hi);
            sort(a, lo, j-1);
            sort(a, j+1, hi);
        }
    
        public static void sort(int[] a) {
    
            sort(a, 0, a.length-1);
        }
  • 相关阅读:
    jdk9 特性
    jdk8 特性
    Eclipse中Spring插件的安装
    C++避免程序运行完后窗口一闪而过的方法
    完全二叉树节点个数
    Shell 编写倒着的*三角形
    Drools源于规则引擎
    Spring Data MongoDB 三:基本文档查询(Query、BasicQuery
    docker环境搭建
    MyBatis根据数组、集合查询
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/8490482.html
Copyright © 2020-2023  润新知