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

本文介绍了一段用于计算快速排序过程中Cn值的Java代码,通过对比不同规模数组(N=100、1000、10000)下Cn的实际值与理论估计值2NlnN,分析了两者之间的差异。代码中包含了数组生成、随机洗牌、快速排序及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);
    }
}

转载于:https://www.cnblogs.com/longjin2018/p/9860194.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值