20162325 2017-2018-2 《程序设计与数据结构》第3周学习总结
教材学习内容概要
查找是在一组项内找到指定目标或是确定目标不存在的过程
高效的查找使得比较的次数最少
Comparable接口允许多态实现算法,而不是只应用于特定的类
二分查找利用了查找池有序的这个特性
二分查找的每次比较都排除了一半的可行候选数据
排序是按某种标准将一列数据项按确定的次序重排的过程
选择排序算法反复地将一个个具体的值放到它最终的有序位置,从而完成一组值的排序
插入排序算法反复地将一个个具体的值插入到表的已有序的子表中,从而完成一组值的排序
冒泡排序算法反复地比较相邻元素,如果必要就交换它们的次序,从而完成一组值的排序
快速排序算法通过划分表,然后再递归地对两个子表进行排序,从而完成一组值的排序
快速排序算法递归地将表平分为两部分,直到每个子表中只含有一个元素,然后将这些子表归并为有序段,从而完成一组值的排序
二分查找有对数阶的复杂度,对于大的查找池来说,这非常有效率
选择排序,插入排序及冒泡排序的平均运行时间复杂度是0(n^2)
快速排序的关键是选择一个好的划分元素
归并排序的最坏运行时间复杂度是(n logn)
比较与分类
线性查找 可以针对任何数组,将数组中的每项依次遍历出来之后,与所要查找项对比。
消耗时间也是不规律的,可能查找项处于数组的第一位,也可能处于数组的最后一位。还有可能数组中完全不存在需要查找的项目。
二分查找 针对有序数组使用。
因为数组已经有序排列,可以通过将数组从中间分割,将中间项与所需查找项对比;然后再根据对比结果,再次向上或者向下,寻找中间项对比,直至完成查找。
而且,对于查找最开始,可以通过与第一项和最末项的对比,确定查找项是否处于此数组中。
穷举法: *线性查找* 直接插入 冒泡排序 简单选择
分治 : *二分查找* 希尔排序 快速排序
定义
(1)选择排序:先扫描整个数组,找最小值,然后与第一位交换。然后再次扫描整个数组,找到次小的值,将这个数和数组第二位交换,如此类推,一直做到整个数组有序
(2)插入排序:每次按顺序从序列中抽取一个数,并将这个数放在序列中正确的位置。
(2)冒泡排序:序列中相邻的两个数进行比较,若为逆序,则进行交换,并重复进行这一系列的操作,最终得到正序的序列。
(3)希尔排序:按照一定的间隔将序列分成若干小组,对这若干小组进行排序。组成新序列,再进行分组、排序,经过若干次后最终得到一个有序的序列
(4)快速排序:选择一个数作为枢轴(一般来说选择第一个为枢轴),然后和其中一个数来比(一般按顺序来)若枢轴大于被比较的那个数,则换位置直到两边分别为均小于枢轴和均大于枢轴。然后分成两边再找枢轴,如此类推直到最后整个序列为一个有序的序列。
(5)归并排序:将每个序列拆开,然后两两组合,将逆序的组进行调换,然后再两两组合、排序,最后得到一个有序的序列
算法复杂度
算法的选择
1.数据规模较小
(1)待排序列基本序的情况下,可以选择直接插入排序;
(2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡
2.数据规模不是很大
(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。
(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序
3.数据规模很大
(1)对稳定性有求,则可考虑归并排序。
(2)对稳定性没要求,宜用堆排序
4.序列初始基本有序,宜用直接插入,冒泡
教材学习中的问题和解决过程
问题1:第三趟为什么不拿97和65比较,而是49和55?
问题1解决方案:请教的王老师
问题2:当时看图把最上面一行阴影部分带入理解,百思不得其解。。。
问题2解决方案:课间询问的娄老师,阴影部分只是假想的临时存储空间,实际操作后对排序无影响
代码调试中的问题和解决过程
- 问题1:win10不支持shell命令,无法从cmd获取代码量
- 问题1解决方案:参考王老师给的链接顺利解决
代码托管
(
)
上周考试错题总结
- 错题1及原因,理解情况
第二个for循环是并列的,非嵌套。而且选项E(2n)指的是2的n次方。第一个for循环执行n次,第二个执行2的n次方,取更复杂的。
- 错题2及原因,理解情况
解析如图翻译
- 错题3及原因,理解情况
特别无语,前一次答题正确,第二次选太快不小心搞反了。。。
本周结对学习情况
- [20162311] (http://www.cnblogs.com/-zzr-/p/7588330.html)
- 结对学习内容
- 课本13章对代码的理解
- 泛型类-bag
-排序PPT
其他(感悟、思考等,可选)
- 这周虽然上课讲的知识是听懂了,但遇到周五课堂测验还是手足无措,发现自己掌握的还只是冰山一角,老师一变通,加大点难度就没辙了。另外动手能力差,程序设计的思路有,但实现起来困难重重,但也没有别的办法,只能多动手多总结。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 58/58 | 1/1 | 10/10 | |
第二周 | 8/18 | |||
第三周 | 134/192 | 3/4 | 12/ 30 |
计划学习时间:12小时
实际学习时间:12小时
改进情况:这周花在写三篇博客上的时间较长