20162326 齐力锋 实验三

实验报告
 课程:程序设计与数据结构
班级: 1623
 姓名: 齐力锋
学号:2016232 成绩: 2分 指导教师:娄嘉鹏 王志强

实验日期:11月6日

 密级:非密级
 预习程度: 已预习
 必修/选修: 必修
 实验序号: 2326

实验一:

  • 完成教材P302 Searching.Java ,P305 Sorting.java中方法的测试
  • 不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
  • 提交运行结果图(可多张)

实验二:

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

实验三:

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

实验四:

  • 补充实现课上讲过的排序方法:希尔排序,堆排序,桶排序,二叉树排序等
  • 测试实现的算法(正常,异常,边界)
  • 提交运行结果截图
  • 推送相关代码到码云上

 

实验过程及问题解决:

一、

第一项实验主要是对Searching和Sorting的各个方法进行测试

主要考察对泛型的应用和对查找算法、排序算法的了解和应用

实验一并不是很难,只是步骤较多。

需要测试边界情况——数组的0下标位置和最后一个元素

异常情况——数组中没有的元素

正序和逆序

依次将各个方法使用Junit测试,测试成功即可

20162326 齐力锋 实验三_第1张图片

 

20162326 齐力锋 实验三_第2张图片

package test;

import cn.edu.besti.cs1623qi26.Searching;
import junit.framework.Test;
import junit.framework.TestSuite; 
import junit.framework.TestCase; 

/** 
* cn.edu.besti.cs1623qi26.Searching Tester.
* 
* @author  
* @since 
11/06/2017
*
@version 1.0 */ public class SearchingTest extends TestCase { public SearchingTest(String name) { super(name); } public void setUp() throws Exception { super.setUp(); } public void tearDown() throws Exception { super.tearDown(); } /** * * Method: linearSearch(Comparable[] data, Comparable target) * */ public void testLinearSearch() throws Exception { //TODO: Test goes here... Comparable Test[] = {2,0,1,6,2,3,2,6}; assertEquals( 2, Searching.linearSearch(Test,2)); assertEquals( 0, Searching.linearSearch(Test,0)); assertEquals( 1, Searching.linearSearch(Test,1)); assertEquals( 6, Searching.linearSearch(Test,6)); assertEquals( 3, Searching.linearSearch(Test,3)); assertEquals( 2, Searching.linearSearch(Test,2)); assertEquals( null, Searching.linearSearch(Test,4));//yic异常 无该值 Comparable Test1[] = {"齐","力","锋"}; assertEquals("齐", Searching.linearSearch(Test1,"齐")); assertEquals("力", Searching.linearSearch(Test1,"力")); assertEquals("锋", Searching.linearSearch(Test1,"锋")); } /** * * Method: binarySearch(Comparable[] data, Comparable target) * */ public void testBinarySearch() throws Exception { //TODO: Test goes here... Comparable Test[] = {2,0,1,6,2,3,2,6}; assertEquals(null, Searching.binarySearch(Test,2));//异常情况 二分查找的查找池无序 Comparable testNormal [] = {1,2,3,5,7,9,16,18}; assertEquals( 3, Searching.binarySearch(testNormal,3)); //正常情况 正序 assertEquals( 5, Searching.binarySearch(testNormal,5)); //正常情况 正序 assertEquals( 7, Searching.binarySearch(testNormal,7)); //正常情况 正序 assertEquals( 9, Searching.binarySearch(testNormal,9)); //正常情况 正序 assertEquals( 16, Searching.binarySearch(testNormal,16)); //正常情况 正序 assertEquals( 18, Searching.binarySearch(testNormal,18)); //正常情况 正序 assertEquals(null, Searching.binarySearch(testNormal,4));//异常情况 无该值 Comparable testReverse [] = {18,16,9,7,5,3,2,1}; assertEquals( 3, Searching.binarySearch(testNormal,3)); //正常情况 逆序 assertEquals( 5, Searching.binarySearch(testNormal,5)); //正常情况 逆序 assertEquals( 7, Searching.binarySearch(testNormal,7)); //正常情况 逆序 assertEquals( 9, Searching.binarySearch(testNormal,9)); //正常情况 逆序 assertEquals( 16, Searching.binarySearch(testNormal,16)); //正常情况 逆序 assertEquals( 18, Searching.binarySearch(testNormal,18));//正常情况 逆序 } public static Test suite() { return new TestSuite(SearchingTest.class); } }
package test;

import cn.edu.besti.cs1623qi26.Sorting;
import junit.framework.Test;
import junit.framework.TestSuite; 
import junit.framework.TestCase; 

/** 
* cn.edu.besti.cs1623qi26.Sorting Tester.
* 
* @author  
* @since 
11/06/2017
*
@version 1.0 */ public class SortingTest extends TestCase { public SortingTest(String name) { super(name); } public void setUp() throws Exception { super.setUp(); } public void tearDown() throws Exception { super.tearDown(); } /** * * Method: selectionSort(Comparable[] data) * */ public void testSelectionSort() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18}; Sorting.selectionSort(testNormal); System.out.println("选择排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: insertionSort(Comparable[] data) * */ public void testInsertionSort() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18}; Sorting.insertionSort(testNormal); System.out.println("插入排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: bubbleSort(Comparable[] data) * */ public void testBubbleSort() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18}; Sorting.bubbleSort(testNormal); System.out.println("冒泡排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: quickSort(Comparable[] data, int min, int max) * */ public void testQuickSort() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18}; Sorting.quickSort(testNormal,0,7); System.out.println("快速排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: mergeSort(Comparable[] data, int min, int max) * */ public void testMergeSort() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18}; Sorting.mergeSort(testNormal,0,7); System.out.println("归并排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: merge(Comparable[] data, int first, int mid, int last) * */ public void testMerge() throws Exception { //TODO: Test goes here... Comparable testNormal [] = {1,3,6,5,7,9,20,18,31}; Sorting.merge(testNormal,0,4,8); System.out.println("归并排序测试"); for (Comparable i : testNormal) System.out.print(i + " "); } /** * * Method: main(String args[]) * */ public void testMain() throws Exception { //TODO: Test goes here... } /** * * Method: swap(Comparable[] data, int index1, int index2) * */ public void testSwap() throws Exception { //TODO: Test goes here... /* try { Method method = cn.edu.besti.cs1623qi26.Sorting.getClass().getMethod("swap", Comparable[].class, int.class, int.class); method.setAccessible(true); method.invoke(, ); } catch(NoSuchMethodException e) { } catch(IllegalAccessException e) { } catch(InvocationTargetException e) { } */ } /** * * Method: partition(Comparable[] data, int min, int max) * */ public static Test suite() { return new TestSuite(SortingTest.class); } }

二、

把Sorting.java Searching.java放入 cn.edu.besti.cs1623qi26  包中

把测试代码放到test包中

在测试代码前需要输入一下代码:

package test;

import cn.edu.besti.cs1623qi26.Searching;
import junit.framework.Test;
import junit.framework.TestSuite; 
import junit.framework.TestCase; 

在Linux下的方法
第一步 工程打包成一个jar包

第二步 用import关键字导入包 变量必须是public访问权限

第三步 在linux下执行java -jar jar包名字 就可以实现一个.java文件调用另一个.java文件了
 
 
 
package cn.edu.besti.cs1623qi26;

//********************************************************************
//  cn.edu.besti.cs1623qi26.Searching.java       Java Foundations
//
//  Contains various search algorithms that operate on an array of
//  Comparable objects.
//********************************************************************

public class Searching
{
    //-----------------------------------------------------------------
    //  Searches the specified array of objects using a linear search
    //  algorithm. Returns null if the target is not found.
    //-----------------------------------------------------------------
    public static Comparable linearSearch (Comparable[] data,
                                           Comparable target)
    {
        Comparable result = null;
        int index = 0;

        while (result == null && index < data.length)
        {
            if (data[index].compareTo(target) == 0)
                result = data[index];
            index++;
        }

        return result;
    }

    /*-----------------------------------------------------------------
    //  Searches the specified array of objects using a binary search
    //  algorithm. Returns null if the target is not found.
    //-----------------------------------------------------------------
    */
    public static Comparable binarySearch (Comparable[] data,
                                           Comparable target)
    {
        Comparable result = null;
        int first = 0, last = data.length-1, mid;

        while (result == null && first <= last)
        {
            mid = (first + last) / 2;  // determine midpoint
            if (data[mid].compareTo(target) == 0)
                result = data[mid];
            else
            if (data[mid].compareTo(target) > 0)
                last = mid - 1;
            else
                first = mid + 1;
        }

        return result;
    }
}
package test;

import cn.edu.besti.cs1623qi26.Searching;
import junit.framework.Test;
import junit.framework.TestSuite; 
import junit.framework.TestCase; 

/** 
* cn.edu.besti.cs1623qi26.Searching Tester.
* 
* @author  
* @since 
11/06/2017
*
@version 1.0 */ public class SearchingTest extends TestCase { public SearchingTest(String name) { super(name); } public void setUp() throws Exception { super.setUp(); } public void tearDown() throws Exception { super.tearDown(); } /** * * Method: linearSearch(Comparable[] data, Comparable target) * */ public void testLinearSearch() throws Exception { //TODO: Test goes here... Comparable Test[] = {2,0,1,6,2,3,2,6}; assertEquals( 2, Searching.linearSearch(Test,2)); assertEquals( 0, Searching.linearSearch(Test,0)); assertEquals( 1, Searching.linearSearch(Test,1)); assertEquals( 6, Searching.linearSearch(Test,6)); assertEquals( 3, Searching.linearSearch(Test,3)); assertEquals( 2, Searching.linearSearch(Test,2)); assertEquals( null, Searching.linearSearch(Test,4));//yic异常 无该值 Comparable Test1[] = {"齐","力","锋"}; assertEquals("齐", Searching.linearSearch(Test1,"齐")); assertEquals("力", Searching.linearSearch(Test1,"力")); assertEquals("锋", Searching.linearSearch(Test1,"锋")); } /** * * Method: binarySearch(Comparable[] data, Comparable target) * */ public void testBinarySearch() throws Exception { //TODO: Test goes here... Comparable Test[] = {2,0,1,6,2,3,2,6}; assertEquals(null, Searching.binarySearch(Test,2));//异常情况 二分查找的查找池无序 Comparable testNormal [] = {1,2,3,5,7,9,16,18}; assertEquals( 3, Searching.binarySearch(testNormal,3)); //正常情况 正序 assertEquals( 5, Searching.binarySearch(testNormal,5)); //正常情况 正序 assertEquals( 7, Searching.binarySearch(testNormal,7)); //正常情况 正序 assertEquals( 9, Searching.binarySearch(testNormal,9)); //正常情况 正序 assertEquals( 16, Searching.binarySearch(testNormal,16)); //正常情况 正序 assertEquals( 18, Searching.binarySearch(testNormal,18)); //正常情况 正序 assertEquals(null, Searching.binarySearch(testNormal,4));//异常情况 无该值 Comparable testReverse [] = {18,16,9,7,5,3,2,1}; assertEquals( 3, Searching.binarySearch(testNormal,3)); //正常情况 逆序 assertEquals( 5, Searching.binarySearch(testNormal,5)); //正常情况 逆序 assertEquals( 7, Searching.binarySearch(testNormal,7)); //正常情况 逆序 assertEquals( 9, Searching.binarySearch(testNormal,9)); //正常情况 逆序 assertEquals( 16, Searching.binarySearch(testNormal,16)); //正常情况 逆序 assertEquals( 18, Searching.binarySearch(testNormal,18));//正常情况 逆序 } public static Test suite() { return new TestSuite(SearchingTest.class); } }

三、

实验三是根据老师给的博客链接,学习相关的算法思想,然后自己编代码实现

下面我来谈谈我对各个算法的理解:

插值查找:

实质上,插值查找是在折半查找算法的基础上进行改造,

对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好

将比例1/2向Key调整的更靠近一些

斐波那契查找:

利用斐波那契数列的性质,从第三个数开始,后者是前两个数相加之和

其实斐波那契查找也是从折半查找来的

要考虑三种结果的情况:

  1. 相等,mid位置的元素即为所求
  2.    >     ,low=mid+1;
  3.    <     ,high=mid-1;

二叉树查找算法:

查找操作和二分查找类似,将key和节点的key比较。

如果小于,那么就在Left Node节点查找。

如果大于,则在Right Node节点查找。

如果相等,直接返回Value。

哈希查找:

简述该方法:按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方

 

我的思路:

1)       用给定的哈希函数构造哈希表;

 

2)       根据选择的冲突处理方法解决地址冲突;

 

3)       在哈希表的基础上执行哈希查找。

查找步骤:

1)    对给定k值,计算哈希地址 Di=H(k);若HST为空,则查找失败;若HST=k,则查找成功;否则,执行处理冲突。

2)     重复计算处理冲突的下一个存储地址 Dk=R(Dk-1),直到HST[Dk]为空,或HST[Dk]=k为止。若HST[Dk]=K,则查找成功,否则查找失败。

 

20162326 齐力锋 实验三_第3张图片

 四、

希尔排序:

希尔排序Shell Sort是基于插入排序的一种改进

我的思路:对于n个待排序的数列,取一个小于n的整数 X 将待排序元素分成若干个组子序列,所有距离为X 的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序

堆排序(最大堆):

Key[i]>=Key[2i+1]&&key>=key[2i+2]

  即任何一非叶节点的关键字不小于其左右孩子节点的关键字。

步骤:

1.初始化堆:将R[1..n]构造为堆;

2.将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。

桶排序:

1.建立一堆桶; 
2.遍历原始数组,并将数据放入到各自的桶当中; 
3.对非空的桶进行排序; 
4. 按照顺序遍历这些桶并放回到原始数组中即可构成排序后的数组

你可能感兴趣的:(20162326 齐力锋 实验三)