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版)》学习指导