• 20162307 实验三 查找与排序


    20162307 实验三 查找与排序

    北京电子科技学院(BESTI)

    实 验 报 告

    课程:程序设计与数据结构

    班级:1623

    姓名:张韵琪

    学号:20162307

    指导教师:娄嘉鹏老师、王志强老师

    实验日期:2017年11月06号

    实验密级:非密级

    实验时间:三天

    必修/选修:必修

    实验名称:查找与排序

    实验仪器:电脑

    实验目的与要求:

    • 目的:

       学习查找与排序的应用,实现和分析
      
    • 要求:
      1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
      2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
      3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

    实验内容、步骤

    一、实验要求

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

    一、实验步骤

      1. 仔细研究教材P302 Searching.Java ,P305 Sorting.java
    • 2.根据Searching、Sorting中的方法写测试类

      1. 要求是写不少于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 ("
      第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 ("
      selectionSort :");
        for (Comparable comparable : irr1) {
            System.out.print ( comparable + "  " );
        }
        Sorting.selectionSort ( irr1);
      
        System.out.println ("
      insertionSort :");
        for (Comparable comparable : irr1) {
            System.out.print ( comparable + "  " );
        }
        Sorting.insertionSort ( irr1);
        System.out.println ("
      bubbleSort :");
        for (Comparable comparable : irr1) {
            System.out.print ( comparable + "  " );
        }
        Sorting.bubbleSort ( irr1);
        System.out.println ("
      quickSort :");
        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方法,二叉排序就主要调用这两个方法,找出最大值,然后将其删除,在剩余中再找最大值

    四、实验结果

  • 相关阅读:
    淘宝网与九部委连合启动2011收集全平易近维权
    淘宝不雅光宣布揭晓推出机票价值指数
    文思信息2010年第四财季净利增26.2%
    创业邦“立异中国2011”活动正式启动
    快讯:出路无忧2010第四季度净利润6690万元
    柳传志美国高校演讲:中国企业的国际化之路
    Android 开发笔记八 截屏操作
    Android 开发笔记三 BroadcastReceiver 广播接收者
    Android 开发笔记 一
    Android 开发笔记六 定位
  • 原文地址:https://www.cnblogs.com/Tiffany23/p/7820325.html
Copyright © 2020-2023  润新知