快速排序及时间复杂度

/**
 * 快速排序
 * avg: 2NlnN
 * best: nlgn 每次正好对半分
 * worst: (n^2)/2
 * Created by tjc on 2018/7/27.
 */
public class Quick {

    public static void sort(Comparable[] a) {
        {
            //随机打乱数组
        }
        sort(a, 0, a.length - 1);

    }

    private static void sort(Comparable[] a, int lo, int hi) {
        //切分后 a[0],a[1],...,a[j-1] < a[j]
        //a[j+1],a[j+2],a[n] > a[j]
        int j = partition(a, lo, hi);
        //进行递归,分治
        sort(a, lo, j - 1);
        sort(a, j + 1, hi);
    }

    private static int partition(Comparable[] a, int lo, int hi) {
        int i = lo, j = hi + 1;
        //选取头元素a[lo]做中位数
        Comparable v = a[lo];
        while (less(a[++i], v)) if (j == hi) break;
        while (less(v, a[--j])) if (j == lo) break;
        if (i >= j) exch(a, i, j);
        return j;
    }

    private static void exch(Comparable[] a, int i, int j) {
        //交换a[i],a[j]
    }

    private static boolean less(Comparable a, Comparable b) {
        //a<b return true
        //else
        //return false
    }
}

改进算法

三向切分

应用于含有大量重复元素的数组,分为大于,等于,小于切分元素的数组

public class Quick3way {

    // This class should not be instantiated.
    private Quick3way() { }

    /**
     * Rearranges the array in ascending order, using the natural order.
     * @param a the array to be sorted
     */
    public static void sort(Comparable[] a) {
        StdRandom.shuffle(a);
        sort(a, 0, a.length - 1);
        assert isSorted(a);
    }

    // quicksort the subarray a[lo .. hi] using 3-way partitioning
    private static void sort(Comparable[] a, int lo, int hi) { 
        if (hi <= lo) return;
        int lt = lo, gt = hi;
        Comparable v = a[lo];
        int i = lo + 1;
        while (i <= gt) {
            int cmp = a[i].compareTo(v);
            if      (cmp < 0) exch(a, lt++, i++);
            else if (cmp > 0) exch(a, i, gt--);
            else              i++;
        }

        // a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]. 
        sort(a, lo, lt-1);
        sort(a, gt+1, hi);
        assert isSorted(a, lo, hi);
    }
}
三向切分的示意图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 5,356评论 0 1
  • 数据结构与算法——快速排序 快速排序,顾名思义,它速度很快,针对一般应用中各种不同的输入都要比其他排序算法快很多,...
    sunhaiyu阅读 8,658评论 0 3
  • 时间飞快啊,总是浪费了太多的时间,转眼又过去了一个月的时间,我还记得我上一次写日记的时间,庄严又过去了将近两个月的...
    艾衡阅读 1,175评论 0 0
  • 在互联网时代,网络支付已深入到了人们日常生活的方方面面。因为便捷的支付方式,越来越多的人倾向于这种第三方支付。继工...
    张美月阅读 2,187评论 0 0
  • 你的轮廓 逆光 显现出 雕像般的寂静不语 当我睁开双眼 我在每一颗尘埃里找寻 惊恐的呼唤 就像 受惊的小兔 我循香...
    对对不说对对对阅读 3,421评论 0 3

友情链接更多精彩内容