20162307 2017-2018-1 《程序设计与数据结构》第3周学习总结

20172307 2017-2018-1 《程序设计与数据结构》第3周学习总结

教材学习内容总结(第十三章 查找与排序)

概述

  • 在软件开发过程中很常见的任务就是查找某一具体的元素,并且将一些具体的元素进行排序。
  • 各种排序方法
  • 排序方法的依据原则、特点,排序方法的区别、优缺点

13.1 查找

  • 查找:在一组数据项中找到指定的目标元素,或是判定组内不存在目标的过程。要查找的数据组称为查找池。
  • 两种常用的查找的方法:线性查找二分查找
  • 高效的查找使得比较的次数最少,这样可以提高程序的运行速度

13.1.1 线性查找

  • 将数组中每一个值与目标元素进行比较,最后,或找到目标,或到达表尾但目标不存在于组中
  • public interface Comparable:此接口强行对实现它的每个类的对象进行整体排序。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。
  • int compareTo(A B):比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
  • 查找次数平均为N/2.

13.1.2 二分查找

二分查找借助于查找池中数据的有序性。不从一段开始查找,而是从中间开始。

  • 二分查找:查找次数在10位的数组中最大数为4(运气好的好,也许第一次就找到了)。

线性查找与二分查找的对比

  • 当数组的基数放大时,线性查找次数将会成正比增长,K=N/2;而二分查找,我们通过一个公式来表达,K=㏒2(N),对数计算给出了二分查找法最大耗费的次数。
  • 线性查找可以针对任何数组;二分查找法,针对有序数组使用。

13.2 排序

  • 排序算法(5种):选择排序、插入排序、冒泡排序、快速排序、归并排序
  • 选择排序、插入排序、冒泡排序三种算法的效率差不多;快速排序、归并排序这两种算法效率比另外三种效率更高,算法更复杂。

13.2.1 选择排序

  • 原则:扫描整个表,找到最小值,与第一位置交换

13.2.2 插入排序

  • 原则:将一个个具体的值插入到表的已有序的子表中

  • 分为直接插入排序和希尔排序

  • 直接插入排序:取一个之前未取出来的数,按照大小关系插入到已经有序的数组中

  • 希尔排序(也称缩小增量排序):分成n个短序列进行比较,最后进行直接插入排序

13.2.3 冒泡排序

  • 反复地比较相邻的元素,按照大小关系进行排序。

  • String类中bubbleSort实现这个算法

      private static void bubbleSort(Comparable[]data) {
              int position, scan;
              for (position = data.length - 1; position >= 0; position--) {
              for (scan = 0; scan <= position - 1; scan++) {
                      if (data[scan].compareTo ( data[scan + 1] ) > 0)
                      swap ( data, scan, scan + 1 );
                  }
              }
          }
    

13.2.4 快速排序

  • 将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

  • String类中的quickSort实现此算法

       private static void quickSort (Comparable[] data,int min,int max){
                  int pivot;
                  if (min<max){
                      pivot = partition (data,min,max);
                      quickSort(data,min,pivot-1);
                      quickSort(data,pivot+1,max);
                  }
          }
    

13.2.5 归并排序

  • 递归地对分表,知道每个子表只含有一个元素时为止,然后再将子表按序合并

  • String类中的mergeSort实现此算法

      private static void mergeSort(Comparable[] data,int min,int max){
                  if(min<max){
                      int mid =(min+max)/2;
                      mergeSort ( data,min,mid );
                      mergeSort ( data,mid+1,max );
                      merge (data,min,mid,max);
                  }
          }
    

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

(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

Comparable接口

  • 排序与查找都有用Comparable接口,我不太清楚它的用法,所以我去查了帮助文档

  • 然后,我发现有Comparable接口还有Comparator,那么两者有什么区别呢
  • 上网查找
    Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。

Comparator 和 Comparable 的实例

Comparable:
实现Comparable接口要覆盖compareTo方法, 在compareTo方法里面实现比较:

    public class Person implements Comparable {
         String name;
         int age
         public int compareTo(Person another) {
              int i = 0;
              i = name.compareTo(another.name); // 使用字符串的比较
              if(i == 0) { // 如果名字一样,比较年龄, 返回比较年龄结果
                   return age - another.age;
              } else {
                   return i;  // 名字不一样, 返回比较名字的结果.
              }
         }
    }

这时我们可以直接用 Collections.sort( personList ) 对其排序了.

Comparator:
实现Comparator需要覆盖 compare 方法:

    public class Person{
         String name;
         int age
    }

    class PersonComparator implements Comparator { 
         public int compare(Person one, Person another) {
              int i = 0;
              i = one.name.compareTo(another.name); // 使用字符串的比较
              if(i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果
                   return one.age - another.age;
              } else {
                   return i; // 名字不一样, 返回比较名字的结果.
              }
         }
    }

Collections.sort( personList , new PersonComparator()) 可以对其排序

关于对归并排序的理解

归并排序其实要做两件事:

(1)“分解”——将序列每次折半划分。

(2)“合并”——将划分后的序列段两两合并后排序。

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

问题一

  • 由于我新创了一个项目,没有用上学期的,所以缺少了statistics.sh,然后在idea中运行statistics.sh一直不成功。所以我在终端进行运行,也是不成功。
    忘记加权限了。要 chmod +x statistics.sh

问题二

  • 接着上一个问题,运行成功之后,出现下图的情况

然后我将脚本中的This week中的| grep date +%F --date="-0 days"全部删除,结果就不出现上图的情况了

代码托管

上周考试错题总结

结对及互评

点评模板:

  • 博客中值得学习的或问题:

  • 代码中值得学习的或问题:

本周结对学习情况

- [20162303](http://www.cnblogs.com/syx390234975/)
- 结对学习内容
    - 学习第十三章
    - 研究上课时讲的ppt
    - 巩固算法复杂度

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

这学期的周测改成英语之后,我觉得我英语好差,基本都是要靠词典。新的学期,还是加油吧!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 68/68 1/1 12/12
第三周 298/366 2/3 18/30

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:20小时

  • 实际学习时间:18小时

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-09-24 13:02  张韵琪  阅读(472)  评论(2编辑  收藏  举报