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小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)