2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结
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 |
参考资料
- [Java软件结构与数据结构](第四版)
- java集合包总结
- 《Java学习笔记(第8版)》学习指导
2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结的更多相关文章
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...
- 《JAVA软件结构与数据结构》第一周学习总结
学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...
- 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...
随机推荐
- Tarjan算法初探(2):缩点
接上一节 Tarjan算法初探(1):Tarjan如何求有向图的强连通分量 Tarjan算法一个非常重要的应用就是 在一张题目性质在点上性质能够合并的普通有向图中将整个强连通分量视作一个点来把整张图变 ...
- Ajax与Xml
Ajax就是用javascript来实现的 主要是用来实现页面的局部刷新,比如当你在百度上回答别人的问题时候,没有登录,页面会弹出一个窗口,让你输入账号和密码,这就是利用ajax来做的,如果不是aja ...
- 百度地图热力图--批量地址转换应用(基于百度api)
需求:把外卖订餐地址做个用户分布热力图 思路分析:第一步去百度地图api开放平台找例子 http://lbsyun.baidu.com/jsdemo.htm#c1_15 首先从百度API的demo例子 ...
- Java ArrayList 源代码分析
Java ArrayList 之前曾经参考 数据结构与算法这本书写过ArrayList的demo,本来以为实现起来都差不多,今天抽空看了下jdk中的ArrayList的实现,差距还是很大啊 首先看一下 ...
- [POJ1741]Tree(点分治)
树分治之点分治入门 所谓点分治,就是对于树针对点的分治处理 首先找出重心以保证时间复杂度 然后递归处理所有子树 对于这道题,对于点对(u,v)满足dis(u,v)<=k,分2种情况 路径过当前根 ...
- mybash的编写与调试
fork() 计算机程序设计中的分叉函数.返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记:否则,出错返回-1. fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个 ...
- 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点,包括5个点,两个眼的中心.鼻尖.两个嘴角,以下是测试代码: int test_alignment() { std: ...
- 【BZOJ4543】Hotel加强版
[BZOJ4543]Hotel加强版 题面 bzoj 洛谷 $ps:$在洛谷看题在bzoj交... 题解 我们分析一下这个问题,要怎么样的点才满足三点距离两两相等呢? 1.存在三个点有共同的$LCA$ ...
- spark submit参数及调优(转载)
spark submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数. 使用格式: ./bin/spark-submit \ -- ...
- jquery.validate使用 - 5
一些常用的验证脚本 不会写js了,只能从网上找一些常用的验证脚本. // 手机号码验证jQuery.validator.addMethod("mobile", function(v ...