20202303 实验七《数据结构与面向对象程序设计》实验报告

 # 20202303  2021-2022-1 《数据结构与面向对象程序设计》实验一报告

课程:《程序设计与数据结构》
班级: 2023
姓名: 马澜
学号:20202303
实验教师:王志强
实验日期:2021年11月11日
必修/选修: 必修

## 1.实验内容

    1. 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
      要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
      提交运行结果图。

    2. 重构你的代码
      把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
      把测试代码放test包中
      重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)

    3. 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
      提交运行结果截图

    4. 实现排序方法等(至少3个)
      测试实现的算法(正常,异常,边界)
      提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)

    5. 编写Android程序对实现各种查找与排序算法进行测试
      提交运行结果截图
      推送代码到码云(选做,额外加分)

## 2. 实验过程及结果
   (1)定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。

      在进行排序设计时,可以采用类似“哨兵”思想,提高线性查找效率,并设计测试各种情况下算法的运行结果。相关的代码传送到码云,以下展示测试情况,如图。

 

 

 

 

(2)重构你的代码
      把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
      把测试代码放test包中
      重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)

 第一,将这两个代码放入包中,一般可以鼠标拖动,或者直接写入程序,点击红色小灯泡就可以创建包并且放入,如图。

  第二,重新编译,运行代码,提交编译,运行的截图(IDEA)

  第三,重新编译,运行代码,提交编译,运行的截图(命令行),在这里我重新写了程序,而且进行了分开测试,所以每一个程序都有十个测试用例。

代码如下:

 

 

 测试如下: 

 

 

 

 

(3)参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
提交运行结果截图

 要实现查找,对于之前的以及需要学习的出现好几种,需要我们一一实现。

1.顺序查找:从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

2.二分查找:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

3.插值查找:也就是将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

4.斐波那契查找:二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。

5.二叉树查找:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。算法中需要频繁用到递归思想,需要注意基本情形的设置,避免无穷递归。

6.分块查找:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序"。要做到块与块之间有序,可以自己手动设置界限,来将元素分块。

7.链地址查找:将全部具有同样哈希地址的而不同keyword的数据元素连接到同一个单链表中。假设选定的哈希表长度为m,则可将哈希表定义为一个有m个头指针组成的指针数组T[0..m-1]。凡是哈希地址为i的数据元素,均以节点的形式插入到T[i]为头指针的单链表中。而且新的元素插入到链表的前端,这不仅由于方便。还由于常常发生这种事实:新近插入的元素最优可能不久又被访问。

8.线性查找:线性探测法的地址增量di = 1, 2, ... , m-1,当中,i为探测次数。该方法一次探测下一个地址。知道有空的地址后插入。若整个空间都找不到空余的地址,则产生溢出。

补充算法截图如下:

 

 

 

 

结果如下:

 

(4)实现排序方法等(至少3个)
测试实现的算法(正常,异常,边界)
提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)

 

我选择的排序方法为堆排序,希尔排序,树排序三个方法。

      。希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

     。堆排序:堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

 

   。二叉树排序:

 

(5)编写Android程序对实现各种查找与排序算法进行测试
提交运行结果截图
推送代码到码云(选做,额外加分)

对于安卓平台的编写以及制作如下,这次我选择了Genymotion的小手机。

 

 

## 3. 实验过程中遇到的问题和解决过程
- 问题1:在编写第二个命令行的时候,一开始采用了IDEA自己的local自己进行java与javac的操作,然后一直弹错误,怎么改都不对,麻了,如图:

- 问题1解决方案:最后选择了虚拟机上命令行操作,虽然觉得有一丝丝变简单了的意思,但没办法了,代码越改越乱,我怕了。
- 问题2:在进行虚拟机操作时,由于我自己可能老了,记不住了,格式一直出错,如图:

 

- 问题2解决方案:上网搜了一下,直接javac之后换成java+文件名就行,不用写java了。
- 问题3:在编写递归方法的时候,程序在运行的时候反反复复,递归之后不发生变化。

- 问题3解决方案:最后看那个标准代码,发现自己少写了mid的变化递归。这一步found很重要。

 

 

- 问题4:在虚拟安卓机的过程中,操作不太熟练来着,稍微动一动就标红,写出了一个好丑的布局。

-问题4解决方案:唯手熟尔。


## 其他

感悟:感觉排序好难啊,尤其是代码,有时候就真的看不懂呗,而且安卓机真的难,我都建立好几个了,都想骂人了。而且最近的实验越来越难了,对我自己来说,真的有点痛苦,无语子。而且尤其是排序算法和数据结构这一块,还是不太熟练的样子,希望下次继续加油!!!

## 参考资料

-  《Java程序设计教程(第九版)》

-  《Java软件结构与数据结构(第四版)》

 
- 网页搜索资料:https://blog.csdn.net/qq_26219679/article/details/79647221

- 网页搜索资料:https://blog.csdn.net/weixin_30384217/article/details/99115000

posted @ 2021-11-13 20:02  20202303马澜  阅读(107)  评论(0编辑  收藏  举报