学号 20172326 《程序设计与数据结构》第五周学习总结
教材学习内容总结
查找算法的总结
- 线性查找,经过依次遍历所要查找元素的集合,比较是否存在所需查找的元素,直到找到该元素或返回false代表集合不存在该元素。实现较为简单,==但当集合元素数量巨大时,效率极慢==。
- 二分法查找,经过每次将集合分为两部分,比较所需查找的元素位于中间元素的左半区仍是右半区,依次进行二分,直至找到元素,或返回false。效率较高,例如,一个含义一百万元素的集合,只需20次左右便可完成查找。==但二分法的实现须要基于一个有序数组,不然没法实现。==
排序算法的总结
- 顺序排序——选择排序法,选择排序法每遍历列表依次,找到当前最小元素,将其与列表左侧元素交换,最终将全部元素进行排序。
- 顺序排序——插入排序法,从最左侧元素开始,与其他元素比较,产生一个初步的排序子集,每当下一个比较的元素小于排序子集的最右元素时,通过与子集元素比较,将其插入到子集的顺序位置。子集不断向右与剩余元素进行比较,直至完成排序。
- 顺序排序——冒泡排序,将列表中的元素,从左端开始,两个元素比较大小,若左大右小,两个交换位置,一直往复,将最大元素置于最右位置。每次排序都将当前最大的交换到最右
- 快速排序,使用递归的思想。以一个元素为界限,小在左,大在右。而后在进行递归,左右继续刚才的流程。直到完成排序。其思想与查找中的二分法相似,每次分为两部分,进行排序。从而提升效率。
教材学习中的问题和解决过程
<T extends Comparable<? super T>>
中关于 ==?super T== 的理解算法
- 问题2理解:一开始对于这个“?”,我认为是“非”的意思,但转念一想,非的符号是!,而且在肯定方法的数据类型时,何谈一种非某种数据的数据类型。查阅资料后,获得了答案,?为通配符,除了<? super T>外还有<? extends T>两种。其中前者表示,能够添加父类以及该父类子类的参数,不能添加其超类。同时,其不能返回其相应数据类型的值,只能返回object对象。而<?extends T>表示,类型的上界,表示参数化类型的多是T 或是 T的子类。
首先,<T extends Comparable
>表示泛型参数应用于该方法,可是,泛型方法并不意味着返回一个泛型数据,而是通过编译器判断后,返回一个具体的数据类型的数据。结合起来,总体意识就为,该方法适用于继承了Comparable借口的T方法,其中该参数继承了泛型类型,但其具体数据类型不明。
代码调试中的问题和解决过程
- 问题1:pp9-3问题
- 问题1解决方案:pp9-3要求,将各个排序方法的排序时间进行打印,同时,进行对各方法的排序次数进行计数。排序时间使用
System.nanoTime()
便可得出时间。count也将为简单,可是,在对归并法进行统计时出现了问题。归并法使用了递归的思想,因此,当在递归方法中进行cout++操做以及System.out.println("the count is :")时,会使每次递归都会打印。致使出现数组
the count is :1
the count is :2
the count is 3
the count is :4
the count is :5数据结构
的状况,那么可否将count值进行返回呢?显然是不行的,由于方法均为void型。那么索性将void改成int型,而后将其返回,咱们来看一下归并排序的三个方法函数
public static <T extends Comparable<T>>void mergeSort(T[] data){}
private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max) {}
private static <T extends Comparable<T>> void merge(T[] data, int first, int mid, int last) {}
这里只截取了三个方法的方法头,能够看到,纵使将三个方法改成有返回值型,一个方法与一个方法之间也没法调用该参数。由于静态方法没法使用非静态参数,除非再将其改成非静态方法。如此一来,仅仅加一个count计数就将带来巨大的变化,实非上策。那么该如何实现呢?其实也很简单。咱们要在静态方法里进行操做,那么,就不妨在类头添加一个静态变量,初始化为0,然后,一次交换位置,count++,统计时在第一个方法里直接调用该变量便可。学习
上周考试错题总结
- 错题1:The elements of an _____________ have an inherent relationship defining their order.
- 理解:有序列表能够继承元素之间的顺序,这是由于,有序列表的添加方法中已有排序的方法
- 错题2:The elements of an ordered list do not have an inherent relationship defining their order.
- 理解:与上一题相似,有序列表即有序线性表在添加元素时就可规定其顺序
- 错题3:Interfaces cannot be derived from other interfaces.
- 理解:Java中不容许一个子类继承多个父类,但能够经过实现多个接口来实现相似的形式。
- 错题4:Interfaces allow us to make polymorphic references, in which the method that is invoked is based on the type of the reference variable rather than the particular object being referenced at the time.
- 理解:多态性中有这样一句话: 实际调用的方法版本取决于对象的类型而不是引用变量的类型。
其余(感悟、思考等,可选)
结对及互评
- 博客中值得学习的或问题:
排版精美,对于问题研究得很细致,解答也很周全。
- 代码中值得学习的或问题:
代码写的很规范,思路很清晰,继续加油!
点评过的同窗博客和代码
参考资料
图解排序算法(四)之归并排序
递归和非递归两种方式实现二分法查找