博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algs4-2.3.28递归深度
阅读量:7218 次
发布时间:2019-06-29

本文共 1860 字,大约阅读时间需要 6 分钟。

2.3.28递归深度。用经验性的研究估计切换阀值为M的快速排序在将大小为N的不重复数组排序时的平均递归深度,其中M=10、20和50,N=10^3、10^4、10^5和10^6。

答:通过测试数据得平均递归深度为2.679lg(N/M)
图片
public class E2d3d28
{
   
    public static int sort(Comparable[] a,int M)
    {
      //StdRandom.shuffle(a);
      return sort(a,0,a.length-1,M);
     
    }
   
    private static int sort(Comparable[] a,int lo,int hi,int M)
    {
        //数组少于等于M个元素时使用插入排序
        if (hi-lo+1<M)
        {
            InsertSort(a,lo,hi);
            return 1;
        }
        int j=partition(a,lo,hi);
        int leftDepth=sort(a,lo,j-1,M);
        int rightDepth=sort(a,j+1,hi,M);
        if (leftDepth>rightDepth)
            return leftDepth+1;
        else
            return rightDepth+1;
    }
    
   
    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 void InsertSort(Comparable[] a,int lo,int hi)
    {
        for (int i=lo+1;i<hi+1;i++)
        {
            for (int j=i;j>0 && less(a[j],a[j-1]);j--)
                exch(a,j,j-1);
          }
    }
       
    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 Nlen[]={1000,10000,100000,1000000};
        int Mlen[]={10,20,50};
        for(int Ni=0;Ni<Nlen.length;Ni++)
        {
          int N=Nlen[Ni];
          for (int Mi=0;Mi<Mlen.length;Mi++)
          {
             int M=Mlen[Mi];
             int depth=0;
             for (int time=0;time<10;time++)
             {
                 Double[] a=new Double[N];
                 for(int i=0;i<N;i++)
                     a[i]=StdRandom.random(); 
                  depth=depth+sort(a,M);
             }
             StdOut.printf("%d\t%d\t%d\n",N,M,depth/10);
          }
        }//end for Ni
    }//end main
}//end class

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

你可能感兴趣的文章
OSChina 周三乱弹 —— 打醒精神去瞌睡
查看>>
SSH 密钥登录linux
查看>>
你必须掌握的 21 个 Java 核心技术!
查看>>
告诉你WHT中文站是什么?
查看>>
4、Juniper SSG520 PPTP映射到ROS后MAC无法连接解决方法
查看>>
利用批处理文件来建立一个记录3389登陆者信息
查看>>
Linux 系统下双机HA的实现
查看>>
02_swarm mode key concepts
查看>>
Eclipse打包插件Fat Jar 解压打包
查看>>
Apache Shiro 使用手册
查看>>
CentOS mini 6.5 安装DB2 Express-C 问题处理记录
查看>>
DirectByteBuffer
查看>>
Docker Compose文件详解 V2
查看>>
Memcached的原理与应用(未完)
查看>>
基于 Confluence 6 数据中心的 SAML 单点登录设置你的身份提供者
查看>>
mysql总结
查看>>
Navicat for MySQL版本更新至v11.2.12,修复多项问题|附下载
查看>>
整理 JAVA中的IO流 (字符流和字节流两个大类)
查看>>
uefi与win8 (根据网络资料整理)
查看>>
Eclipse优化
查看>>