2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结

教材学习内容总结

第9章 排序与查找

9.1查找

  • 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素。对其进行查找的项目组有时也称为查找组。

  • 两种常见的查找方式:线性插找、二分查找

  • 要尽可能高效的完成查找,要最小化比较操作次数,通常,查找池里项目数目越多,为了寻找该目标而做出的比较操作次数就越多,因此,该查找池中项目的树目定义了该问题的大小。

  • 9.1.3线性查找法

    • 如果该查找池组织成了一个某类型的列表,那么完成该查找的一个简单方式就是从该列表头开始一次比较每一个值,直到找到该目标元素为止。
    • 示意图

- 平均查找长度: 1/2(n+i)
- 时间复杂度: O(N)
  • 9.1.4二分查找法

    • 二分查找是从排序列表的中间开始查找,而不是从一端或另一端开始。如果没有在那个中间元素找到目标元素则继续查找。
    • 二分查找将利用查找池中的项目组是已排序的这一事实。
    • 示意图

- 平均查找长度: (n+1/n)*(log2(n+1))-1
- 时间复杂度: O(logN)
  • 查找算法的比较

    • 二分查找的每次比较都会删除一半的可行候选项
    • 二分查找的复杂度是对数级的,这使得它对大型查找池非常有效率

9.2排序

  • 排序是这样一个过程,即基于某一标准,要么以升序要么以降序将某一组项目按照某个规定顺序排列。

  • 顺序排序:选择排序、插入排序、冒泡排序

  • 对数排序:快速排序、归并排序

  • 9.2.1选择排序法

    • 选择排序算法通过反复地将某一特定值放到它在列表中的最终已排序位置,从而完成对某一列值的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.2插入排序法

    • 插入排序算法通过反复的将某一特定值插入到该列表某个已排序的子集中来完成对列表值的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.3冒泡排序法

    • 冒泡排序算法通过重复的比较相邻元素且在必要时将他们互换,从而完成对某个列表的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.4快速排序法

    • 快速排序算法通过将列表分区,然后对这两个分区进行递归式排序,从而完成对整个列表的排序
    • 时间复杂度:O(nlgn)
    • 示意图(快速排序(Quicksort)是对冒泡排序的一种改进。)

  • 9.2.5归并排序法

    • 归并排序算法通过将列表递归式分为两半直至每一字列表都含有一个元素,然后将这些字列表归并到一个排序顺序中,从而完成对列表的排序。
    • 时间复杂度:O(nlgn)
    • 示意图

教材学习中的问题和解决过程

  • 问题1:选择排序与插入排序的区别,课本中提及到两个排序的概念:

    • 选择排序算法是反复的将一个个具体的值放到它最终的有序位置,从而完成一组值得排序。
    • 插入排序算法是反复的将一个个具体的值插入到表的已有序的子表中,从而完成一组值得排序。
    • 这两个的概念刚开始的时候看起来好像一样,本来就有点迷,认真一想更迷了。
  • 问题1解决方案:在上课的时候听王老师讲解,王老师说选择是在有序序列里操作,后来仔细思考之后发现选择排序排出来之后之前的序列是肯定不变,而插入序列就不是,他就是在原本的有序序列之中插入一个元素。所以这就是他们的差别。

  • 问题2:为什么在查找排序时都要实现Comparable这个接口?

  • 问题2解决方案:

    • 通过查找API文档:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
    • 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

代码调试中的问题和解决过程

  • 问题1和解决方案:首先我将pp9.2的i设定为3,然后开始编写,运行之后可以正确,但是我眉头一皱发现有两个地方并不简单,首先按照我这样的方法,如果把i改成其他的就会排序错误或者报错

同时我还发现,如果按照我现在的思路,好像运行到后来和冒泡排序就没有区别了,我再一看题,才发现是减少某个大于1的数

我这样写问题就很大了,最后我又加了一层循环

但是

最后我把 for (scan = 0; scan <= data.length - i; scan++) 的<+改成=才解决问题

代码托管

上周考试错题总结

好像没有错题,嘿嘿嘿

结对及互评

  • 博客中值得学习的或问题:

    • 优点:代码编写时遇到的问题记录非常详细;对书本上的内容理解也到位;这周的博客不仅交的早,质量是极高。
  • 本周结对学习情况

其他(感悟、思考等,可选)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 671/671 1/2 17/25
第三周 345/1016 1/3 15/40
第四周 405/1421 2/5 23/63
第五周 1202/2623 1/5 20/83

参考资料

2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结的更多相关文章

  1. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  2. 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

  4. 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...

  6. 《JAVA软件结构与数据结构》第一周学习总结

    学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...

  7. 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...

  8. 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...

  9. 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...

  10. 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...

随机推荐

  1. python 用户注册用户名

    实现用户注册网站,编辑用户名时判断是否已经存在: 若存在则提示“The name you used have already existed,please change your name” 若不存在 ...

  2. svg路径动画心得

    svg动画,随着路线运动,项目中需要用到,接触的时候感觉很高级,但是不会-无从下手呀!于是在网上找相关资料,先借鉴再修改成自己的. <svg width="500" heig ...

  3. Windows 安装Redis程序

    一.系统环境 1.硬件系统:Windows7 64位 2.软件环境: Redis 64位 3.2.100.Redis Desktop Manager. 二.Redis安装 下载地址:https://g ...

  4. html-html简介

    一.什么是HTML? HypeText Markup Language:超文本标记语言,网页语言 超文本:超出文本的范畴,使用HTML可以轻松实现这样的操作 标记:HTML所有的操作都是通过标记实现的 ...

  5. 【五】安装fcig

    安装fcig 安装fcig 此步骤是为了让spawn-fcgi能够识别自定义的demo 编译文件 自定义c文件 测试成功后,启动spawn cgi进行代理托管 此步骤是为了让spawn-fcgi能够识 ...

  6. 【原创】frozenset集合函数入门及实例

    函数作用 frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素.与之对应的是set函数,set无序排序且不重复,是可变的,有add(),remove()等方法. 函数原型 f ...

  7. 一个博客萌新的C语言之旅(持续更新中....)

    先更新上一次留下的的C语言练习答案,如下: #include <stdio.h> double mj(double r) { return 3.14*r*r; } int main() { ...

  8. JAVA乐观锁实现-CAS

    是什么 全称compare and swap,一个CPU原子指令,在硬件层面实现的机制,体现了乐观锁的思想. JVM用C语言封装了汇编调用.Java的基础库中有很多类就是基于JNI调用C接口实现了多线 ...

  9. 20155331 2016-2017-2《Java程序设计》课程总结

    20155331 2016-2017-2<Java程序设计>课程总结 每周作业 预备作业1:新学期,新展望 预备作业2:游戏经验 第一周学习总结:大致浏览教材并提出问题 第二周学习总结:基 ...

  10. oracle基础命令

    oracle使用步骤: 一.oracle安装 两个文件解压到同一文件夹,doc为说明/使用文档 二.oracle启动: 1.启动oracle:启动监听和自定义库 2.启动cmd->sqlplus ...