美文网首页
排序算法——快速排序

排序算法——快速排序

作者: 令狐蛋挞 | 来源:发表于2017-07-22 21:03 被阅读0次

    原理

    快速排序运用了递归的思想。 以升序为例,

    1. 在一趟排序过程中,取一个标准值,将小于标准值放到左边,不小于标准值的放到右边,最后返回标准值所在的位置middle
    2. 对左边(start ~ middle)部分进行单次排序(递归)
    3. 对右边(middle + 1 ~ end) 部分进行单次排序(递归)
    4. 对直到start >= end,排序结束。

    复杂度分析

    平均时间复杂度为O(n*㏒₂n),每次将数据源对半分
    时间复杂度最坏为O(n^2), 数据源一开始就是有序状态,在进行数据源分割的时候总是分为1 和n-1
    空间复杂度为 O(㏒₂n),递归所需栈空间
    不稳定

    代码实现

    public void sort(int[] a){
        qsort(a, 0, a.length - 1);
    }
    
    private void qsort(int[] a, int start, int end){
        if (start >= end) {//递归出口
            return ;
        }
        int middle = stepSort(a, start, end);//单次排序
        qsort(a, start, middle);//左边递归
        qsort(a, middle + 1, end);//右边递归
    }
    
    /**
     * 单次排序
     * 本次排序结束,左边的值<标准值<=右边的
     * return 标准值所在位置
     **/
    private int stepSort(int[] a, int start, int end){
        int std = a[start];
        while (start < end){
            while (start < end && a[end] >= std){//找到右边第一个比标准值小的位置
                end--;
            }
            a[start] = a[end];//放到左侧
            while (start < end && a[start] < std){//找到左边第一个不小于标准值的位置
                start++;
            }
            a[end] = a[start];
        }
        a[start] = std;
        return start;
    }
    

    相关文章

      网友评论

          本文标题:排序算法——快速排序

          本文链接:https://www.haomeiwen.com/subject/bezukxtx.html