InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中,

采用的是从后往前一步一步查找的方法,习题2.3-6要求利用习题2.3-5中的binary search的方法,加速这个插入的过程。

把binary search 的算法稍加修改,就可以返回正确的,插入元素的位置:

    public static int findInsertPlace(int [] A,int target,int a, int b)
    {
        int  middle = a+(b-a)/2;
        if(a>b)
            return a;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return findInsertPlace(A,target,middle+1,b);
        else
            return findInsertPlace(A,target,a,middle-1);
    }
findInsertPlace和binary search唯一的不同,在于:
if(a>b) return a;同学们可以动手画一画,检验一下到底对还是不对。改进后的InsertSort如下:
public class ImprovedInsertSort {
    public static void sort(int [] A)
    {
        for(int i =1; i<A.length;i++)
        {
            int temp = A[i];
            int insertPlace = findInsertPlace(A,temp,0,i-1);
            for(int j= i-1 ; j>=insertPlace; j--)
                A[j+1] =A[j];
            A[insertPlace] = temp;
        }
        return ;
    }
    public static int findInsertPlace(int [] A,int target,int a, int b)
    {
        int  middle = a+(b-a)/2;
        if(a>b)
            return a;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return findInsertPlace(A,target,middle+1,b);
        else
            return findInsertPlace(A,target,a,middle-1);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int A [] ={1, 7,5,5 ,2, 4,6, 7,4,23,11,34,15};
        ImprovedInsertSort.sort(A);
        for(int a:A)
            System.out.print(a+" ");
    }
}

改进之前,InsertSort在最坏情况下是O(n^2),改进之后,是O( n*lg(n) ),算法效率大大提升了。

 

《算法导论》习题2.3-6 改进的InsertSort的更多相关文章

  1. [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录

    开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...

  2. (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)

    (搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...

  3. 算法导论课后习题解答 第一部分 练习1.1-1->1.1-5

    很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...

  4. 算法导论第十八章 B树

    一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...

  5. 《算法导论》— Chapter 11 散列表

    1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言 ...

  6. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  7. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  8. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  9. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  10. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

随机推荐

  1. 构建一个最简单的web应用并部署及启动

    第一种构建方式:不使用maven File-new-Dynamic Web Project,用这种方式构建的web项目是在web.xml文件中配置了welcome-file的,但是却没有对应的文件,所 ...

  2. MySQL操作失误导致mysql数据库查看不了

    使用  show databases; +--------------------+| Database           |+--------------------+| information_ ...

  3. jQuery checkbox 全选

    jQuery 1.6版本以后 if($("#id").attr("checked")) 不能返回 ture 和 false 高版本中jQuery 提供prop ...

  4. Android多线程下安全访问数据库

    http://zhiwei.neatooo.com/blog/detail?blog=5343818a9d4869f0310000de github 原文https://github.com/dmyt ...

  5. Linux学习 -- 系统管理

    1 进程管理 判断服务器健康状态 top [选项] 查看系统中所有进程 ps aux      BSD格式 ps -le        Linux格式 pstree [选项] -p   显示PID - ...

  6. Day05_JAVAEE系列:Junit

    Junit 单元测试开发工具:myeclipse10 内部集成的junit的库 1)什么是junit?     junit是一个专业的编写测试代码的工具 2)建立junit测试类的步骤:     2. ...

  7. C语言中的几种常见排序算法

    1.冒泡排序法:如果有N个数,两两相邻进行比较,将最值沉入最后一位置,要进行N-1轮比较, 第一轮要比较N-1次,第2轮只要比较N-1-1次,因为第一次已经把最值沉入最后一位置,故 不需在进行比较一次 ...

  8. YII2 随笔 视图最佳实践

    yii\base\Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果. yii\base\Controller::renderPartial(): 渲染一个 ...

  9. docker rmi all

    docker stop $(docker ps -a -q) docker rm $(docker ps -a -q)

  10. SD卡的控制方法(指令集和控制时序)

    1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD ...