20162307 实验三 查找与排序
20162307 实验三 查找与排序
北京电子科技学院(BESTI)
实 验 报 告
课程:程序设计与数据结构
班级:1623
姓名:张韵琪
学号:20162307
指导教师:娄嘉鹏老师、王志强老师
实验日期:2017年11月06号
实验密级:非密级
实验时间:三天
必修/选修:必修
实验名称:查找与排序
实验仪器:电脑
实验目的与要求:
-
目的:
学习查找与排序的应用,实现和分析
-
要求:
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验内容、步骤
一、实验要求
完成教材P302 Searching.Java ,P305 Sorting.java中方法的测试
不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图(可多张)
一、实验步骤
-
- 仔细研究教材P302 Searching.Java ,P305 Sorting.java
-
2.根据Searching、Sorting中的方法写测试类
-
- 要求是写不少于10个测试,所以要有正常,边界、异常的情况
-
定义了10个数组
Comparable[] irr1 = {1, 2, 3, 4, 5, 2307}; Comparable[] irr2 = {1, 1, 1, 1, 1, 1, 1, 1, 1}; Comparable[] irr3 = {2307, 5, 4, 3, 2, 1}; Comparable[] irr4 = {1, 0, 1, 0, 1, 0}; Comparable[] irr5 = {-1, -2, -3, 2307}; Comparable[] irr6 = {1.1, 1.2, 1.3, 23.07}; Comparable[] irr7 = {0.0, 1.0, 2.0, 3.0}; Comparable[] irr8 = {"a", "b", "c", "zhangyunqi"}; Comparable[] irr9 = {"a", "a", "a", "zhangyunqi"}; Comparable[] irr10 = {0.00, 1.23, 23.00};
-
Searching的测试:
//irr1 linearSearch System.out.println ("\n第1组 {1, 2, 3, 4, 5, 2307}:"); Comparable find = (Comparable)Searching.linearSearch(irr1,2307); System.out.println("linearSearch(1) find 2307:"); if(find==null){ System.out.println("Not find "); }else { System.out.println ("Find it"); } System.out.println(); //irr1 binarySearch Comparable find1= (Comparable)Searching.binarySearch ( irr1,2307 ); System.out.println("binaryDearch(1) find 2307:"); if(find1==null){ System.out.println("Not find "); }else { System.out.println ("Find it"); } System.out.println();
-
Sorting的测试
System.out.println ("第1组 {1, 2, 3, 4, 5, 2307}: "); Sorting.selectionSort (irr1 ); System.out.println ("\nselectionSort :"); for (Comparable comparable : irr1) { System.out.print ( comparable + " " ); } Sorting.selectionSort ( irr1); System.out.println ("\ninsertionSort :"); for (Comparable comparable : irr1) { System.out.print ( comparable + " " ); } Sorting.insertionSort ( irr1); System.out.println ("\nbubbleSort :"); for (Comparable comparable : irr1) { System.out.print ( comparable + " " ); } Sorting.bubbleSort ( irr1); System.out.println ("\nquickSort :"); for (Comparable comparable : irr1) { System.out.print ( comparable + " " ); } Sorting.quickSort ( irr1,0,irr1.length-1); System.out.println ("mergeSort :"); for (Comparable comparable : irr1) { System.out.print ( comparable + " " ); } Sorting.mergeSort ( irr1,0,irr1.length-1);
一、实验结果
二、实验要求
重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs1623.(姓名首字母+四位学号) 包中
把测试代码放test包中
重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
课下把代码推送到代码托管平台
二、实验步骤
- 创建个包 cn.edu.besti.cs1623.zyq2307,将Searching、Sorting放入包内
- 再建test,Make Directory as Test Source Root
二、实验结果
三、实验要求
参考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中补充查找算法并测试
提交运行结果截图
三、实验步骤
-
查看老师所给的博客
-
补充方法
-
写出测试
public static Comparable SequenceSearch(Comparable[] data, Comparable target, int n) { int i; for (i = 0; i < n; i++) if (data[i] == target) return i; return -1; } public static int FibonacciSearch(int [] a, int n, int key){ int [] F = new int[a.length]; int low, high, mid, i, k; low = 1; high = n; k = 0; while (n > F[k]-1) /* 计算n位于斐波那契数列的位置 */ k++; while (low <= high) { mid = low + F[k-1] -1; if (key < a[mid]){ high = mid - 1; k = k - 1; } else if (key > a[mid]){ low = mid + 1; k = k - 2; } else { if (mid <= n) return mid; else return n; } } return 0; } public static Comparable InsertionSearch(int[] data, int target) { Comparable result = null; int first = 0, last = data.length - 1, mid; while (result == null && first <= last) { mid = (first + last) / 2 if (data[mid] == (target)) result = data[mid]; else if (data[mid] - (target) > 0) last = mid - 1; else first = mid + 1; } return result; } public static Comparable BinarySearchTree(Comparable<T> data, int target){ BTNode <T> root ; root = new BTNode <T> ( (T) data ); ArrayIterator<T> iter = new ArrayIterator <T> (); if (root != null) root.inorder ( iter ); return (Comparable) iter; } public static int fibSearch(Comparable data, Comparable[] target,int m,int k,int[] fib){ int i=fib[m],p=fib[m-1],q=fib[m-2]; int t; while(k!=target[i].compareTo (data)){ if(k<target[i].compareTo ( data )){ if(q==0)return 0; else { i-=q; t=p; p=q; q=t-p; } } if(k>target[i].compareTo ( data )){ if(p==1)return 0; else{ i+=q; p-=q; q-=p; } } } return i; }
三、实验结果
四、实验要求
补充实现课上讲过的排序方法:希尔排序,堆排序,桶排序,二叉树排序
测试实现的算法(正常,异常,边界)
提交运行结果截图
推送相关代码到码云上
四、实验步骤
-
希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
public static void ShellSort(Comparable[] data) {//希尔 for (int i = data.length / 2; i > 2; i /= 2) { for (int j = 0; j < i; j++) { insertionSort ( data ); } } insertionSort ( data ); }
-
堆排序:(最大堆)根为最大值,每次取根的值,再移除,将叶子点放到根处,再使其变成最大堆,再取根
public class MaxHeapSort { void init(int[] data) { this.queue = new int[data.length + 1]; for (int i = 0; i < data.length; i++) { queue[++size] = data[i]; fixUp(size); } } private int size = 0; private int[] queue; public int get() { return queue[1]; } public void remove() { fixDown(1); } // fixdown private void fixDown(int k) { int j; while ((j = k << 1) <= size) { if (j < size && queue[j] < queue[j + 1]) j++; if (queue[k] > queue[j]) // 不用交换 break; k = j; } } private void fixUp(int k) { while (k > 1) { int j = k >> 1; if (queue[j] > queue[k]) break; k = j; } } }
-
桶排序:桶排序的基本思想是:把数组 arr 划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并。
1.找出待排序数组中的最大值max、最小值min
2.我们使用 动态数组ArrayList 作为桶,桶里放的元素也用 ArrayList 存储。桶的数量为(max-min)/arr.length+1
3.遍历数组 arr,计算每个元素 arr[i] 放的桶
4.每个桶各自排序
5.遍历桶数组,把排序好的元素放进输出数组public static void Bucketsort(int data[],int min,int max){ int i,j; int temp[] = new int[max - min]; int buckets[] = new int[max - min]; //记录每个元素在序列中出现的次数 for(i = 0; i < data.length; ++i) { buckets[data[i]]++; } //计算“落入”桶内的元素在有序序列中的位置 for(i = 1; i < max; ++i) { buckets[i] = buckets[i] + buckets[i - 1]; } //将num[]中的数据完全复制到temp[]数组 System.arraycopy(data, 0, temp, 0, data.length); //根据buckets数组中的信息将待排序列的各元素放入相应的位置 for(j = data.length - 1; j >= 0; --j) { data[--buckets[temp[j]]] = temp[j]; } }
-
二叉树排序:排序二叉树的定义也是递归定义的,需要满足:
(1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值;
(2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值;
(3)左、右子树也分别是排序二叉树
之前LinkedBinaryTree中有findMax,remove方法,二叉排序就主要调用这两个方法,找出最大值,然后将其删除,在剩余中再找最大值