美文网首页
快速排序及时间复杂度

快速排序及时间复杂度

作者: 我不懂我不懂a | 来源:发表于2018-07-27 21:25 被阅读0次
/**
 * 快速排序
 * 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);
    }
}
三向切分的示意图

相关文章

  • php排序算法

    冒泡排序 选择排序 插入排序 快速排序 时间复杂度 空间复杂度 空间复杂度(Space Complexity)是对...

  • 006【算法篇】线性时间排序

    前面我们提到的插入排序、归并排序及快速排序均有个特点,即时间复杂度渐近下界为?(nlgn),哪怕是随机化的快速排序...

  • php-归并排序、快速排序、堆排序

    归并排序、快速排序、堆排序 时间复杂度 O(nlogn) 归并排序 快速排序(快排) 堆排序

  • OC 排序算法(冒泡,选择,快速)

    选择排序,时间复杂度O(n2) 冒泡排序 快速排序

  • 看图说话排序算法之归并排序

    归并排序和快速排序类似,都典型以递归方式实现的算法,归并排序的时间复杂度分析也和快速排序的时间复杂度分析类似。本文...

  • 算法

    排序算法有哪些?最快的排序算法是哪个?手写一个冒泡排序手写快速排序代码快速排序的过程、时间复杂度、空间复杂度手写堆...

  • 理解快速排序算法

    快速排序的时间复杂度为O(nlogn),空间复杂度为O(n)。根据@张小牛 的文章快速排序(Quick Sort)...

  • 快速排序

    四 快速排序 因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。...

  • 快速排序的一点思考

    Hello, 快速排序 快速排序(quick sort)的最好、平均时间复杂度为,最坏为,并且在平均情况下,复杂度...

  • Python 快速排序的思考(快排 & K-th Max

    一、 快速排序与归并排序的比较 快速排序的最快的时间复杂度为O(n),最差情况下的时间复杂度为O(n^2),平均的...

网友评论

      本文标题:快速排序及时间复杂度

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