• 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小时

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

    参考资料

  • 相关阅读:
    【CF720D】Slalom 扫描线+线段树
    【CF724F】Uniformly Branched Trees 动态规划
    【CF725G】Messages on a Tree 树链剖分+线段树
    【CF736D】Permutations 线性代数+高斯消元
    【CF799E】Aquarium decoration 线段树
    【CF739E】Gosha is hunting 贪心
    【CF744D】Hongcow Draws a Circle 二分+几何
    【BZOJ3774】最优选择 最小割
    【BZOJ2138】stone Hall定理+线段树
    【BZOJ4445】[Scoi2015]小凸想跑步 半平面交
  • 原文地址:https://www.cnblogs.com/Tiffany23/p/7582057.html
Copyright © 2020-2023  润新知