实验三 查找与排序

实验三 查找与排序

实验内容

实验三-查找与排序-1

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

实验三-查找与排序-2

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

1和2实验的内容基本上是差不多的,就是第二个实验有将代码打包的要求,先在idea里创建一个package,然后在代码的第一行package cn.edu.besti.cs1623.zhl2304;

实验三-查找与排序-3

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

在这个类中,一共实现了7个查找算法,分别是线性查找、二分查找、顺序查找、二分查找、插值查找、斐波那契查找、树表查找。

以插值查找为例:

public static Integer InsertionSearch(Integer[] data, int target) {
	int low, mid, high;
	low = 0;
	high = data.length - 1;
	while (low < high) {
	    mid = low + (high - low) * (target - data[low]) / (data[high] - data[low]);
	    if (target > data[mid])low = mid + 1;
	    else if (target < data[mid])high = mid - 1;
	    else return mid;
	}
	return null;
}

二分查找中查找点计算如下:
  mid=(low+high)/2, 即mid=low+1/2*(high-low);
因为根据查找的数值可以在一定程度上推断出算法上更优的起点的,所以我们设计如下的查找点:
  mid=low+(key-a[low])/(a[high]-a[low])*(high-low),
通过修改查找点的比例,让查找点更贴近target。
  基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找,时间复杂度为O(log2(log2n))。

实验三-查找与排序-4

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

以希尔排序为例:希尔排序,也称递减增量排序算法,实质是分组插入排序。由 Donald Shell 于1959年提出。希尔排序是非稳定排序算法。

希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。

以下是Python实现的希尔排序

def shell_sort(ary):
    n = len(ary)
    gap = round(n/2)       #初始步长 , 用round四舍五入取整
    while gap > 0 :
        for i in range(gap,n):        #每一列进行插入排序 , 从gap 到 n-1
            temp = ary[i]
            j = i
            while ( j >= gap and ary[j-gap] > temp ):    #插入排序
                ary[j] = ary[j-gap]
                j = j - gap
            ary[j] = temp
        gap = round(gap/2)                     #重新设置步长
    return ary

上面选择了1/2的步长,一直折半至0.

posted @ 2017-11-12 18:30  20162308马平川  阅读(393)  评论(1编辑  收藏  举报