20182311 2019-2020-1 《数据结构与面向对象程序设计》实验七报告

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验七报告

课程:《程序设计与数据结构》
班级: 1823
姓名: 冷冲
学号:20182311
实验教师:王志强
实验日期:2019年10月30日
必修/选修: 必修

1.实验内容

  • 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位提交运行结果图。
  • 重构你的代码把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301),把测试代码放test包中重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
  • 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试,提交运行结果截图。
  • 补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个),测试实现的算法(正常,异常,边界)提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)
  • 编写Android程序对实现各种查找与排序算法进行测试,提交运行结果截图,推送代码到码云(选做,加分)。

2. 实验过程及结果

  • 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
  • 补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等
  • 参考 ,学习各种查找算法并在Searching中补充
    • 线性查找:遍历数组,找到则返回数组元素下标,未找到返回-1;

    • 二分查找:

      • 折半实现:使用first和last标记所有元素的起始处和结尾处,mid取(first+last)/2,当first<=last时循环,实现每次指向中值的查找。
      • 递归实现:大致代码如下,递归方法需要增加两个形参用来标记递归进行到哪一步了。
      public static Comparable BinarySearch2(Comparable[] data,Comparable target,int first,int last){
              int mid=(first+last)/2;
              if(data[mid].compareTo(target)==0){
                  return mid+1;
              }
              if(data[mid].compareTo(target)>0)
                   return BinarySearch2(data,target,first,mid-1);
              if(data[mid].compareTo(target)>0)
                  return BinarySearch2(data,target,mid+1,last);
              return false;
      }
      
      • 插值查找:二分查找法的改进版,只是将mid的取值方式改进如下:
       mid=first+(target-data[first])/(data[last]-data[first])*(last-first);
      
      • 哈希查找:通过求余算法确定访问元素的下标。
      • 斐波那契查找:获取斐波那契数列,再使用黄金分割算法确定访问元素的下标。
      • 插入排序:利用双重循环和插入,逐渐将整个表从前向后实现有序排列。
      • 折半插入排序:对插入排序的改良,将线性探索改为折半探索
      • 快速排序:根任意元素划分表,再递归的对两个子表进行排序,从而完成一整组的排序。
      • 归并排序:先递归的把表对分成每个子表只含一个元素,再将子表按序合并。
      • 选择、冒泡排序:



  • 重构你代码,放入cn.edu.besti.cs1823.Lc20182311包中重新编译提交编译IDEA,命令行两种运行截图。

  • 编写Android程序对实现各种查找与排序算法进行测试
    安卓的布局真令人头疼,动不动就覆盖。

3.实验过程中遇到的问题及解决过程

  • 问题1:使用compareto比较两个comparable数组元素出错
  • 问题1解决方案:使用compareTo方法进行两个对象的比较,首先要将类继承comprable接口,这一点做到了。但是下列代码就会报错,因为数组第一行只是声明了一个数组,没有实例化不能使用compareTo方法。
Comprare[] a=new Comprare[4];
a[1].comprareTo(a[2]);
  • 问题2:为什么使用arrays.sort()方法必须实现Comparable接口?
  • 问题2解决方案:Arrays.sort(Object[] objs)方法的排序机制是,在内部把Object数组里面强制转换为Comparable类型,再调用compareTo()方法进行排序。调用CompareTo()方法需要实现Comparable接口。

4.参考资料

posted @ 2019-11-16 09:32  冷冲  阅读(185)  评论(0编辑  收藏  举报