Algs4-2.3.6计算快排Cn的准确值

 2.3.6编写一段代码来计算Cn的准确值,在N=100、1000和1000的情况下比较准确值和估计值2NlnN的差距。
图片
public class E2d3d6
{
    static int Cn=0;
    public static void sort(Comparable[] a)
    {
     Cn=0;
      StdRandom.shuffle(a);
      sort(a,0,a.length-1);
      StdOut.printf("N=%8d Cn=%8d 2NlnN=%8.0f 2NlnN/Cn=%2.1f\n",a.length,Cn,2*a.length*Math.log(a.length),2*a.length*Math.log(a.length)/Cn);
    }
   
    private static void sort(Comparable[] a,int lo,int hi)
    {
        if (hi<=lo) return;
        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;
        Comparable v=a[lo];
        while(true)
        {
            while(less(a[++i],v)) if(i==hi) break;
            while(less(v,a[--j])) if(j==lo) break;
            if(i>=j) break;
            exch(a,i,j);
        }
        exch(a,lo,j);
        return j;
    }
   

   
    private static boolean less(Comparable v,Comparable w)
    { Cn++;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)
    {
        Double[] a=new Double[100];
        Double[] b=new Double[1000];
        Double[] c=new Double[10000];
        Double[] d=new Double[100000];
        Double[] e=new Double[1000000];
        for(int i=0;i<a.length;i++)
            a[i]=StdRandom.uniform();
       
        for(int i=0;i<b.length;i++)
            b[i]=StdRandom.uniform();
       
        for(int i=0;i<c.length;i++)
            c[i]=StdRandom.uniform();
       
        for(int i=0;i<d.length;i++)
            d[i]=StdRandom.uniform();
       
        for(int i=0;i<e.length;i++)
            e[i]=StdRandom.uniform();
       
        sort(a);
        sort(b);
        sort(c);
        sort(d);
        sort(e);
    }
}

posted @ 2018-10-27 09:38  修电脑的龙生  阅读(370)  评论(0编辑  收藏  举报