博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algs4-2.3.7计算快排子数组数量
阅读量:5939 次
发布时间:2019-06-19

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

2.3.7在使用快速排序将N个不重复的元素排序时,计算大小为0、1和2的子数组的数量。如果你喜欢数学,请推导;如果你不喜欢,请做一些实验并提出猜想。
答:设使用快速排序的数组长度为N。
图片
将数组一分为二时之前的分界元素不在这两个子数组中,所以两个子数组的总长度为N-1。
归纳得出第i层的所有子数组中的元素总个数为第i-1层元素总个数-第i-1层的节点数,得出第i层所有子数据的元素总数a=N-2^0-2^1-2^3...-2^(i-1)=N-(2^0+2^1+2^2+2^3+...2^(i-1))=N-(2^i-1)=N-2^i+1
由二叉树性质得出第i层的节点个数b=2^i
第i层各节点的平均拥有的元素个数c=a/b,代入得c=(N-2^i+1)/2^i
c=(N+1)/2^i-2^i/2^i
c=(N+1)/2^i-1
(N+1)/2^i=c+1
2^i=(N+1)/(c+1)
据此得大小为0的子数组个数<=N+1个,大小为1的子数组个数<=(N+1)/2 ,大小为2的子数组个数<=(N+2)/3
实验数据表示 子数组个数介于 (N+1)/(c+1)/2 与(N+1)/(c+1)之间。
实验数据如下图:
图片
代码如下:
public class E2d3d7
{
    static int array0=0;
    static int array1=0;
    static int array2=0;
    public static void sort(Comparable[] a)
    {
           array0=0;
      array1=0;
      array2=0;
   
      int N=a.length;
      StdRandom.shuffle(a);
      sort(a,0,a.length-1);
      StdOut.printf("N=%7d array0=%7d array1=%7d array2=%7d\n",a.length,array0,array1,array2);
    }
   
    private static void sort(Comparable[] a,int lo,int hi)
    {
        if (hi-lo+1==0)
            array0++;
        else if (hi-lo+1==1)
            array1++;
        else if(hi-lo+1==2)
            array2++;
       
        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)
    { 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];
        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();
       
        sort(a);
        sort(b);
        sort(c);
    }
}

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

你可能感兴趣的文章
clear session on close of browser jsp
查看>>
asp.net mvc Post上传文件大小限制 (转载)
查看>>
关于吃掉物理的二次聚合无法实现的需要之旁门左道实现法
查看>>
mysql出现unblock with 'mysqladmin flush-hosts'
查看>>
oracle exp/imp命令详解
查看>>
开发安全的 API 所需要核对的清单
查看>>
Mycat源码中的单例模式
查看>>
WPF Dispatcher介绍
查看>>
fiddler展示serverIP方法
查看>>
C语言中的随意跳转
查看>>
006-spring cloud gateway-GatewayAutoConfiguration核心配置-GatewayProperties初始化加载、Route初始化加载...
查看>>
WPF中如何将ListViewItem双击事件绑定到Command
查看>>
《聚散两依依》
查看>>
小tips:你不知道的 npm init
查看>>
Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
查看>>
Jmeter也能IP欺骗!
查看>>
Rust 阴阳谜题,及纯基于代码的分析与化简
查看>>
ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
查看>>
(原創) array可以使用reference方式傳進function嗎? (C/C++)
查看>>
STM32F103--(二) GPIO实践
查看>>