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