• 实验三 查找与排序


    实验三 查找与排序

    实验内容

    实验三-查找与排序-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.

  • 相关阅读:
    每日总结3.8
    Go中定时器实现原理及源码解析
    Go语言实现布谷鸟过滤器
    详解Go语言调度循环源码实现
    Go语言中时间轮的实现
    详解Go语言I/O多路复用netpoller模型
    详解Go中内存分配源码实现
    Go中由WaitGroup引发对内存对齐思考
    【分享】java精品实战教程
    nginx实战教程
  • 原文地址:https://www.cnblogs.com/pingch/p/7816960.html
Copyright © 2020-2023  润新知