20172304 《程序设计与数据结构》第五周学习总结
教材学习内容总结
本博客图片纯属网络资源如有雷同纯属巧合。
来源:百度图片。
本章主要对查找和排序的相关问题进行了讲解。并介绍了几种较为常用的查找和排序方法。
查找:从某个项目组中寻找指定目标元素,或者确定该组中并不存在该目标元素。
查找池:对其查找的项目组。
从算法的角度来说,我们希望最小化比较操作的次数。
9.1.1静态方法
静态方法又称类方法,可以通过类名来激活。可以不必使用实例化来调用方法。声明方法时使用static修饰符就可以将方法声明为静态的。
泛型方法要创建泛型方法,只需在方法头的返回类型前插入一个泛型声明就可以了。例如
public static <T extends Comparable<T> boolean>
linearSearch (T[] data, int min, int max, T target)
9.1.3线性查找法
线性查找: 从该列表头开始一次比较每一个值,知道找到该目标元素。
线性查找示意图
9.1.4 二分查找法
二分查找是从排序列表的中间开始查找,如果没有在那个中间元素找到目标元素,则继续查找。通过比较削减一般的查找池,剩下的一半查找池将表示为可行候选项,以相同方式继续查找,每一次比较都会将可行候选向削减一半,直至最终找到目标元素,或者不再存在可行候选项。
二分查找示意图
9.2 排序
排序:基于某一标准,要么一圣墟要么已将徐将某一组项目按照某个规定顺序排列。
基于效率排序算法通常也分为两类:
顺序排序:他通常使用一对嵌套循环对n个元素排序,需要大约n²次比较;以及对数排序,它对n个元素进行排序通常需要大约nlog₂n次比较。
9.1.2 选择排序法
选择排序算法的一般策略如下:扫描整个列表以找到最小值。将这个值与该列表第一个位置处的值交换。扫描(除了第一个值的)剩余部分列表并找出最小值,然后将它和该列表第二个位置处的值进行交换。扫描(除了前两个值的)剩余部分列表并找出最小值,然后将它和该列表第三个位置处的值交换。对列表中每一个位置继续该过程。当这一过程结束后,列表也就已经排好序了。
选择排序示意图
9.2.2 插入排序法
对列表的头两个值依据其相对大小对其及逆行排序,如果有必要则将它们互换。将列表的第三个值插入到头两个(已排序的)值中的恰当位置。然后将第四个值插入到列表头三个值中的正确位置。每做出一次插入,该排序子集中的值数目就会增加一个。继续这一过程,直至列表中的所有元素都得到完全排序。
插入排序示意图:
9.2.3 冒泡排序法
扫描该队列且比较邻接元素,如果它们不是按相对顺序排列则将其互换。这就像把最大值“冒泡”到列表的最后位置,这是它在最终已排序列表中的恰当位置。然后再次扫描该列表,冒泡出倒数第二个值。继续这一过程,直至所有元素都被冒泡到它们正确的位置。
冒泡排序示意图:
9.2.4 快速排序法
首先选择一个列表元素作为分区元素。下一步,分割该列表,时的小于该分区元素的所有元素位于该元素的左边,所有大于该分区元素的元素位于有表。最后,将该快速排序策略(递归式)应用于两个分区。
快速排序法示意图:
9.2.5 归并排序法
首先将列表分为两个大约相等的部分,然后对每一个部分列表递归调用其自身。继续该列表的递归分解,直至达到该递归的基本情形,这是该列表被分割成长度为1的列表。
归并排序法示意图:
9.3 基数排序法
基数排序的大致思路有点像投桶,就是将先按照个位搜集数据然后在按照十位数搜集数据以此类推最终按顺序输出。
教材学习中的问题和解决过程
问题:各种排序的应用场景
问题解决方案:
冒泡排序
冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说排序完成。规模比较小的时候应用冒泡排序,主要应用于教学。。。
选择排序--只会移动N次
选择排序的主要思想:首先找到数组中最小的那个元素,其次,将它和第一个元素交换。接下来找第二小和第二个交换。运行时间和输入无关,数据移动最少。当数据量较小的时候适用。
插入排序
时间复杂度为O(n^2),数据量小时使用。并且大部分已经被排序。
快速排序
快速排序是最快的通用排序算法,在大多数实际情况中,快速排序是最佳选择。在java的默认排序中是使用的是三向切分排序。
归并排序
如果需要稳定,空间不是很重要,请选择归并。
O(n)时间复杂度的基数排序
当范围已经知道,而且空间不是很重要的情况下使用基数排序。
作者:li563868273
来源:CSDN
原文:https://blog.csdn.net/li563868273/article/details/51200876
版权声明:本文为博主原创文章,转载请附上博文链接!
代码调试中的问题和解决过程
- 问题1:在完成课后作业pp9.2,即在书上冒泡排序的代码的基础上进行编写间隔排序时,发现有一个元素不能正常的进行排序。问题如图。
很明显在运行结果的界面中可以观察到20172304这个元素并没有正常的进行排序。 - 问题1解决方案:后来我查看了改写后的方法,然后认为是循环条件使循环少进行了。
于是我将第一张图片的最后一行代码中的position>1改为了position大于0;然后进行了运行结果如图所示是正常的。 - 问题2:在进行统计各种排序方法的比较次数与运行时间时,我是直接实例化一个Integer型数组,然后通过不同的Integer变量对实例化的数组进行引用,然后在进行排序。但是我发现插入排序的比较次数与选择排序的比较次数相比明显很小。
- 问题2解决方案:我将main函数中的对其他排序方法的调用都注释掉了,然后对整个main函数进行了单步调试,发现最后得到的比较次数是28次,这时,我想到会不会是引用变量的改变引起了被引用对象的改变、于是我就先声明了若干个Integer对象,然后在逐个进行实例化,最后在进行调用,发现这样就没有问题。
- 问题3:在进行归并排序和快速排序的统计中我遇见了问题,因为这两个方法是通过递归实现的。
- 问题3解决方案:
我写了几个方法进行统计
代码托管
上周考试错题总结
- 错题1:
- 错题一解析:这道题说的是接口不可以派生接口,这是错的,我应该是看错了所以才选的true。
博客互评
20172304郭恺同学本次的博客十分优秀,对教材的总结详略得当,而又针对自己在教材中发现的问题进行了深入的鞭辟入里的思考与解答。整个过程看起来赏心悦目给人一种美的享受。
20172328李馨雨同学的博客十分的完整与丰富,体现了她认真的学习态度。
点评过的同学博客和代码
其他(感悟、思考等,可选)
本周又经过了充分的学习与思考,整合与联系。又不断地充实了自己,希望在老师的引领下,能学到更多更好的有用的知识。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/1 | 10/10 | |
第二周 | 766/796 | 1/2 | 40/50 | |
第三周 | 817/1613 | 1/3 | 20/70 | |
第四周 | 1370/3983 | 2/5 | 30/100 | |
第五周 | 1235/5214 | 1/6 | 10/110 |
参考资料
1.蓝墨云班课
2.java软件结构与数据结构
3.java如何计算运行程序时间
4.各种排序的应用场景