2.3.25切换到插入排序。实现一个快速排序,在子数组元素少于M时切换到插入排序。用快速排序处理大小N分别为10^3、10^4、10^5和10^6的随机数组,根据经验给出使其在你的计算环境中运行速度最快的M值。将M从0变化到30的每个值所得到的平均运行时间绘成曲线。注意:你需要为算法2.2添加一个需要三个参数的sort()方法以使Insertion.sort(a,lo,hi)将子数组a[lo..hi]排序。
答:
1)使用10^6长度的数组,M从2到99,进行了100次测试,排序用时最少的M在6至25之间,其中M=11时,排序用时最少的次数出现最多。具体有:M=11时 15次用时最少,M=15时 12次用时最少,M=13时 12次用时最少,M=10时 11次用时最少。

2)见图

import java.awt.Color;
public class E2d3d25
{
    public static void sort(Comparable[] a,int M)
    {
      //StdRandom.shuffle(a);
      sort(a,0,a.length-1,M);
    }
   
    private static void sort(Comparable[] a,int lo,int hi,int M)
    {
        //数组少于等于M个元素时使用插入排序
        if (hi-lo+1<M)
        {
            InsertSort(a,lo,hi);
            return;
        }
        int j=partition(a,lo,hi);
   
        sort(a,lo,j-1,M);
        sort(a,j+1,hi,M);
    }
 
    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 bestM()
    {
        //用来记录M不同值时排序花费的时间
        Double[] T=new Double[100];
        //使用一个10^6方的数组进行排序测试
        int N=1000000;
        Double[] a=new Double[N];
        for(int i=0;i<N;i++)
            a[i]=StdRandom.random();
        //子数组最小长度只可能是1,所以M必须从1开始
        //跳过为0、1的索引使得索引与M一一直接对应
        for(int M=2;M<T.length;M++)
        {
            //对于不同的M使用相同的排列进行排序
            Double[] aClone=new Double[a.length];
            for(int i=0;i<a.length;i++)
                aClone[i]=a[i];
            //开始排序并计时
             Stopwatch timer=new Stopwatch();
             sort(aClone,M);
             T[M]=timer.elapsedTime();
             //StdOut.printf("%d\t%f\n",M,T[M]);
        }//end for M
        //找出用时最小的M
        int minM=2;
        for(int i=3;i<T.length;i++)
            if (less(T[i],T[minM])) minM=i;
        StdOut.println("best M=" +minM);       
    }//end bestM
 
    public static void drawAverageTime()
    {
        //
        StdDraw.setXscale(0,35);
        StdDraw.setYscale(-0.5,3);
        //
        int Nlen[]={100000,1000000,3000000};//
        for(int Ni=0;Ni<Nlen.length;Ni++)
        {
          int N=Nlen[Ni];
          //生成一个长度为N的数组a
          Double[] a=new Double[N];
          for(int i=0;i<N;i++)
            a[i]=StdRandom.random(); 
          //M从0至30对数对组a的副本进行排序,同一长度的N,不同的M时待排序数组内容相同
          Double totalTime=0.0;
          StdDraw.setPenColor(Color.BLACK);
          StdDraw.setPenRadius(0.02);
          for(int M=2;M<=30;M++)
          {
              //生成一个数组a的副本aClone
              Double[] aClone=new Double[N];
              for (int i=0;i<a.length;i++)
                  aClone[i]=a[i];
              //数组长度为N,小于等于M时切换到插入排序的快速排序
              Stopwatch timer=new Stopwatch();
              sort(aClone,M);
              totalTime=totalTime+timer.elapsedTime();
              StdDraw.point(M,timer.elapsedTime());
          }//end for M
          StdDraw.setPenColor(Color.RED);
          StdDraw.setPenRadius(0.01);
          StdDraw.line(2,totalTime/29,30,totalTime/29);
        }//end for Ni
    }
  
    public static void main(String[] args)
    {
        //for (int i=0;i<100;i++)
        //   bestM();
        drawAverageTime();
      
    }//end main
}//end class

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

Algs4-2.3.25切换到插入排序的试验相关推荐

  1. python算法与数据结构-插入排序算法(34)

    阅读目录 一.插入排序的介绍 二.插入排序的原理 三.插入排序的图解 四.插入排序的python代码实现 五.插入排序的C语言代码实现 六.插入排序的时间复杂度 七.插入排序的稳定性 一.插入排序的介 ...

  2. 搞不懂的算法-排序篇1

    最近在学习算法,跟着<Algorithms>这本书,可能是自己水平不够吧,看完排序算法后各种,希尔,归并,快排,堆的实现在脑子里乱成一锅粥,所以就打算大概总结一下,不求精确,全面,只想用平 ...

  3. 排序(一)归并、快排、优先队列等(图文具体解释)

    排序(一) 0基础排序算法 选择排序 思想:首先,找到数组中最小的那个元素.其次,将它和数组的第一个元素交换位置.再次.在剩下的元素中找到最小的元素.将它与数组的第二个元素交换位置. 如此往复,直到将 ...

  4. 排序算法 Java实现

    选择排序 核心思想 选择最小元素,与第一个元素交换位置:剩下的元素中选择最小元素,与当前剩余元素的最前边的元素交换位置. 分析 选择排序的比较次数与序列的初始排序无关,比较次数都是N(N-1)/2. ...

  5. Windbg 教程-调试非托管程序的基本命令下

    前面的文章调试非托管程序的基本命令中讲到如何使用windbg在程序中设置断点,既然断点已经设置好了,下一步就是直接执行程序,程序中断以后,第一件事情就是查看堆栈.在windbg中查看堆栈使用k命令就可 ...

  6. 【算法】快速排序算法的编码和优化

    参考资料 <算法(第4版)>          - - Robert Sedgewick, Kevin Wayne <啊哈! 算法>              - - 啊哈磊 ...

  7. 软件的安装(包括yum仓库与源码包的安装)

    软件的安装 实验背景: 为了提高Linux服务器的易用性.扩展功能,安装软件包是管理员必备的技能,这其中又以RPM方式的安装操作最基础.最常用. 另外有时候需要解决依赖关系,要配置yum仓库.YUM ...

  8. 美术干货:用Blender绘制low poly风格的游戏角色

    "low poly"(低面建模)因其独特的美术风格和相对不错的性价比成为一些游戏的首选,不过作为一种普及范围不算很广的建模手法,其具体的操作流程可能还不为人熟知. 笔者找到了一份用 ...

  9. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

最新文章

  1. java代码走查常见错误_FindBugs常见错误描述和解决方法
  2. Linux SendMail服务启动慢总结
  3. unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!
  4. C++11 Primer Plus(三)之名称空间与类
  5. 10分钟python游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏
  6. [转] Spring XML配置十二个最佳实践
  7. ontological 词根词缀_词根的魅力
  8. 第二章:Improving On User Commands--14.格式化长句
  9. spss分析方法-判别分析
  10. 微信小程序常见的几种UI组件库
  11. 单片机音频谱曲软件_基于51单片机音乐播放仿真 乐谱制作软件 音乐资料
  12. 人工智能专题讲学:开源数据支撑下的人物与装备分析
  13. 防治颈椎病,别陷入误区
  14. 联想7400pro打印有横黑道
  15. MySQL InnoDB配置统计信息
  16. VUE2 组件间传值
  17. 子进程child_process的spawn模块使用
  18. 计算机高配置表格,数据大的excel表格对显卡有要求-求excel大量数据处理的电脑配置...
  19. 最大网络流算法之dinic算法
  20. Facebook背后的人工智能

热门文章

  1. 使用OData协议查询Windows日志
  2. [导入]全国哀悼日 网站变灰装(附代码)[转]
  3. docker安装zookeeper
  4. 都是执行软件测试,差异点在那里
  5. 死锁发生的条件以及如何避免死锁
  6. Jmeter 测试结果分析之聚合报告简介
  7. idea 模块jdk依赖总是自动变_解决IDEA中导入新的maven依赖后Language Level自动重置问题...
  8. js获取下月时间_JS获取上月,本月,下月的开始时间与结束时间
  9. 总结 10 年前端经验,谈谈前端人如何更快地成长
  10. 软件测试中qa的职责,软件测试 -- 测试人员和QA的区别