20172330 2018-2019-1 《程序设计与数据结构》第五周学习总结

20172330 2018-2019-1 《程序设计与数据结构》第五周学习总结

教材学习内容总结

查找

  • 1.静态方法
    静态方法又称为类方法,可以通过类名来激活。
    在方法声明中,可以通过static修饰符就可以把它声明为静态的。

  • 2.泛型方法

  • 3.线性查找法
    即从列表头开始依次比较每一个值,直至找到该目标元素或到列表尾未找到,这是一种最简单的查找方式,但它的效率并不是高效的。

  • 4.二分查找法
    二分查找算法是在有序数组中用到的较为频繁的一种算法,就是不断将数组进行对半分割,每次拿中间元素和目标进行比较。

排序

排序是这样一个过程,即基于某一标准,将某一组项目按照某个规定顺序排列。具体可分为以下几种:

当我们渴望先知道排在前面的是谁时,我们用选择排序;当我们不断拿到新的数并想保持已有的数始终有序时我们用插入排序;当给出的数列已经比较有序,只需要小幅度的调整一下时,我们用冒泡排序。

  • 1.选择排序
    基本思想: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
    算法步骤
    设数组为a[0…n-1]
  1. 初始时,数组全为无序区为a[0..n-1]。令i=0
  2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
  3. i++并重复第二步直到i==n-1。排序完成。
  • 2.插入排序
    基本思想: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的, 如此反复循环,直到全部排好顺序。
    算法步骤:
    1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
    2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

  • 3.冒泡排序
    冒泡排序是最常用的数组排序算法之一,它排序数组元素的过程总是小数往前放,大数往后放,类似水中气泡往上升的动作,所以称作冒泡排序。
    算法步骤:
    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    3.针对所有的元素重复以上的步骤,除了最后一个。
    4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  • 4.快速排序
    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环可以在大部分的架构上很有效率地被实现出来。
    算法步骤:
    1 .从数列中挑出一个元素,称为 “基准”(pivot),
    2 .重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3.基准的位置将数列分为左右两部分,将左右两部分按照上面的步骤重复(递归调用)即可。
    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

  • 5.归并排序
    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。
    算法步骤:
  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾.

步骤2~5为合并两个有序区间

基数排序法

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

  • 问题1:查找算法的比较
  • 问题1解决方案:在将书上9.1.5阅读完之后又百度了一下详细的了解了
    区别:
    1.线性查找可以针对任何数组,将数组中的每项依次遍历出来之后,与所要查找项对比。
    消耗时间也是不规律的,可能查找项处于数组的第一位,也可能处于数组的最后一位。还有可能数组中完全不存在需要查找的项目。
    2.二分查找法,针对有序数组使用。
    因为数组已经有序排列,可以通过将数组从中间分割,将中间项与所需查找项对比;然后再根据对比结果,再次向上或者向下,寻找中间项对比,直至完成查找。
    而且,对于查找最开始,可以通过与第一项和最末项的对比,确定查找项是否处于此数组中。

线性查找与二分查找法的差异

  • 问题2:五种排序的比较
  • 问题2解决方案
    在阅读完书籍并且百度后进行了很多了解,可以说每一种都有其各自的特点,在不同的环境下采用不同的排序方法。

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

  • 问题1:在测试类的时候出现了错误
  • 问题1解决方案:检查后发现数组名在定义时出错。

代码托管

上周考试错题总结

结对及互评

  • 基于评分标准,我给严域俊的博客打分:7分。得分情况如下:

正确使用Markdown语法(加1分)

模板中的要素齐全(加1分)

教材学习中的问题和解决过程, (加3分)

感想,体会真切的(加1分)

点评认真,能指出博客和代码中的问题的(加1分)

  • 博客中值得学习的或问题:
    • 图片和文字相结合,方便理解。
    • 增加了博客中的目录,方便查看,同时样式进行了更新,显得更加美观
    • 阅读了许多资料,使得博客更有说服力。
  • 代码中值得学习的或问题:
    - commit依旧很详细,有条理性。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172333
    • 结对学习内容
      教材第9章,运行教材上的代码
      完成课后自测题,并参考答案学习
      完成课后自测题,并参考答案学习
      完成程序设计项目:至少完成PP9.2、PP9.3

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

这一周花了点心思在这一章上面,也好好阅读了很多内容,掌握的还算可以。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 700/700 1/2 10/20
第三周 700/1400 1/3 10/30
第四周 500/1900 2/5 10/40
第五周 569/2469 1/6 10/50

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:10小时

  • 实际学习时间:10小时

参考资料

原文地址:https://www.cnblogs.com/linanlalala/p/9794521.html