课程:《程序设计与数据结构》html
班级: 1723java
姓名: 方艺雯算法
学号:20172314shell
实验教师:王志强数组
实验日期:2018年12月3日数据结构
必修/选修: 必修ide
实验查找与排序-1学习
定义一个Searching和Sorting类,并在类中实现linearSearch(教材P162 ),SelectionSort方法(P169),最后完成测试。
要求很多于10个测试用例,提交测试用例设计状况(正常,异常,边界,正序,逆序),用例数据中要包含本身学号的后四位
提交运行结果图。测试
实验查找与排序-2网站
重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs1723.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1723.G2301)
把测试代码放test包中
从新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
查找与排序-3
参考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中补充查找算法并测试
提交运行结果截图
查找与排序-4
补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
测试实现的算法(正常,异常,边界)
提交运行结果截图
(3分,若是编写多个排序算法,即便其中三个排序程序有瑕疵,也能够酌情得满分)
查找与排序-5
编写Android程序对各类查找与排序算法进行测试
提交运行结果截图
推送代码到码云
复杂度分析:最坏状况下,时间复杂度为O(log2n),且其指望复杂度也为O(log2n)。)
代码
/*定义斐波那契查找法*/ public static int FibonacciSearch(int[] a, int n, int key) { int low = 0; int high = n - 1; //定义一个斐波那契数组 int max = 20; int[] F = new int[max]; F[0] = 1; F[1] = 1; for (int i = 2; i < max; i++) { F[i] = F[i - 1] + F[i - 2]; } int k = 0; while (n > F[k] - 1)//计算n位于斐波那契数列的位置 k++; int[] temp;//将数组a扩展到F[k]-1的长度 temp = new int[F[k] - 1]; for (int x = 0; x < a.length; x++) { temp[x] = a[x]; } for (int i = n; i < F[k] - 1; ++i) temp[i] = a[n - 1]; while (low <= high) { int mid = low + F[k - 1] - 1; if (key < temp[mid]) { high = mid - 1; k -= 1; } else if (key > temp[mid]) { low = mid + 1; k -= 2; } else { if (mid < n) return mid; //若相等则说明mid即为查找到的位置 else return n - 1; //若mid>=n则说明是扩展的数值,返回n-1 } } return -1; }
实现希尔排序,堆排序,二叉树排序,而后编写测试类测试正常,异常,边界,希尔排序和堆排序有写博客分析过,而二叉树排序是之前没有学习过的,但也较好理解。
//希尔排序 public static <T extends Comparable<T>> void shellSort(T[] data) { if (data == null || data.length <= 1) { return; } int gap = data.length / 2; while (gap >= 1) { for (int a = 0; a < data.length; a++) { for (int b = a; b < data.length - gap; b = b + gap) { if (data[b].compareTo(data[b + gap]) > 0) { T temple = data[b]; data[b] = data[b + gap]; data[b + gap] = temple; } } } gap = gap / 2; } String result = ""; for (int i = 0; i < data.length; i++) { result += data[i] + " "; } System.out.println(result); }
//堆排序 public static <T extends Comparable<T>> void heapSort(T[] data) { ArrayHeap<T> temp = new ArrayHeap<T>(); for (int i = 0; i < data.length; i++) temp.addElement(data[i]); int num = 0; while (!(temp.isEmpty())) { data[num] = temp.removeMin(); num++; } }
//二叉树排序 public static <T extends Comparable<T>> void binarytreeSort(T[] data) { AVLTree tree = new AVLTree(); for (int i = 0; i < data.length; i++) { tree.addElement(data[i]); } tree.printTree2(); }
问题一解决:我原本觉得这两种类型是差很少的,虽然一直不知道这两个的具体区别而后上网查找了两者区别,参考完全让你明白 Integer 类和 int 基本数据类型的区别,其基本API为:
因此我把数组定义类型统一为Integer类型就能够了。
此次实验的实验五记得是比较麻烦的一个,主要牵扯的类太多,常常出现错误要从不少以前的类里排查,会比较麻烦。但在修改过程当中也学习到了新的知识。此次实验主要是关于排序和查找。也学会了更多的算法,温习了Junit的使用。