课程:《程序设计与数据结构》
班级: 1723
姓名: 赵乾宸
学号:20172316
实验教师:王志强
必修/选修:必修
1.实验内容
1
定义一个Searching和Sorting类,并在类中实现linearSearch(教材P162 ),SelectionSort方法(P169),最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。
2
重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs1723.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1723.G2301)
把测试代码放test包中
重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
3
参考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中补充查找算法并测试
提交运行结果截图
4
补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
测试实现的算法(正常,异常,边界)
提交运行结果截图
2. 实验过程及结果
(1) 在实验三(1)中,分别实现线性查找和选择排序,皆是书上代码,曾经实现过,再加深理解之后复制了过来。测试时采用Junit测试,在数组{2, 0, 1, 7, 2, 3, 1, 6}中,分别查找位于最后的“6”,重复的“2”,中间的“7”,索引0、索引7处的数字,以及所找数字不存在的情况。结果正常。
然后对选择排序进行测试,分别使用数字、英文字母、特殊字符、中文进行了测试,结果正常。
(2) 对原有代码重构了之后,在IDEA和虚拟机上分别对代码进行测试,测试通过。
(3) 在原有代码基础上增加新的查找方法。
我增添了三个新的查找方法:二分查找、插值查找、以及斐波那契(Fibonacci)查找。由于C++和Java语言非常相似,转换起来并不困难。
(4) 补充排序方法。我补充了四个排序方法:冒泡排序、归并排序、希尔排序以及插入排序
3. 实验过程中遇到的问题和解决过程
(1) 从基本原理上来看,斐波那契查找和二分查找几乎没有什么不同,区别仅仅在于分割的位置不同,为什么会去选择斐波那契查找?
两者貌似没有什么太大的不同,但实验三(3)中提供的博客中提到,
(斐波那契查找在)最坏情况下,时间复杂度为O(log2n),且其期望复杂度也为O(log2n)
而二分查找在
最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n)
其次,斐波那契查找在进行查找之前,已经建立好了一个斐波那契数列,以便于查找的进行,每一次分割时都直接取数列中确定的索引值,相对于二分查找节省了一次除法运算。
(可以看到,过程中不需要除以二或其他运算,直接从斐波那契数列中拿到下一个分割点)
参考资料
《Java程序设计与数据结构教程(第二版)》
《Java程序设计与数据结构教程(第二版)》学习指导