码迷,mamicode.com
首页 > 其他好文 > 详细

2.3.7

时间:2018-06-03 17:36:47      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:割点   str   compareto   最小值   就是   tin   partition   you   random   

question:

Find the expected number of subarrays of size 0, 1, 2 when quicksort is used to sort an array of N items with distinct keys, If you are mathematically inclined, do the math; if not run some experiments to develop hypotheses.

answer:

//不会数学推导,

然后观察数据0的有N的1/3

      1的有N的1/3

        2的有N的1/6

//不知道观察的对不对QAQ

import edu.princeton.cs.algs4.*;

public class Quicksort
{
    public static int x=0, y=0, z=0;
    
    public static void sort(Comparable[] a)
    {
        StdRandom.shuffle(a);//打乱数组a
        sort(a, 0, a.length - 1);
    }
    
    private static void sort(Comparable[] a, int lo, int hi)
    {
        if(lo > hi)
            x++;
        if(lo == hi)
            y++;
        if(lo+1 == hi)
            z++;
        if(hi <= lo)//递归退出的边界条件
            return;
        int j = partition(a, lo, hi);//找分割
        sort(a, lo, j-1);//递归,在分割点j左边继续找分割点
        sort(a, j+1, hi);//递归,在分割点j右边继续找分割点
    }
    
    private static int partition(Comparable[] a, int lo, int hi)//找分割点并把分割点放到最终位置上(也就是说分割点一旦归位就不会再移动了)
    {
        int i = lo, j = hi+1;
        Comparable v = a[lo];//把数组第一个元素作为分割点
        while(true)
        {
            while(less(a[++i], v)) if(i==hi) break;//找左边第一个大于分割点的数,if是防止恰好分割点就是最大值
            while(less(v,a[--j])) if(j==lo) break;//找右边第一个小于分割点的数,if是防止恰好分割点就是最小值
            if(i >= j) break;//找到分割点的最终位置时退出循环
            exch(a, i, j);//i不满足小于分割点,j也不满足大于分割点,所以交换他们两个就都满足条件了
        }
        exch(a, lo, j);//最终交换分割点和左边数组最后一个元素(因为是--j,所以最后判断条件不满足后j又减了一个,所以j在的位置就是左边数组最后一个了)
        return j;//返回分割点位置
    }
    
    private static boolean less(Comparable v, Comparable w)
    {
        return v.compareTo(w) < 0;
    }
    
    private static void exch(Comparable[] a, int i, int j)
    {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    
    private static void show(Comparable[] a)
    {
        for(int i = 0; i < a.length; i++)
            StdOut.print(a[i] + " ");
        StdOut.println();
    }
    
    public static boolean isSorted(Comparable[] a)
    {
        for(int i = 1; i < a.length; i++)
        {
            if(less(a[i], a[i-1]))
                return false;
        }
        return true;
    }
    
    public static void main(String[] args)
    {
        int N = 1000;
        int i = 1;
        while(N*i <= 20000)
        {
            Double[] a = new Double[N*i];
            for(int t = 0; t < N*i; t++)
                a[t] = StdRandom.uniform();
            sort(a);
            assert isSorted(a);
            StdOut.printf("%5d %5d %5d %5d",N*i, x, y, z);
            StdOut.println();
            x = y = z = 0;
            i++;
        }

    }
}

 

2.3.7

标签:割点   str   compareto   最小值   就是   tin   partition   you   random   

原文地址:https://www.cnblogs.com/w-j-c/p/9129574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!