20172332 2017-2018-2 《程序设计与数据结构》实验三报告

20172332 2017-2018-2 《程序设计与数据结构》实验三报告

课程:《程序设计与数据结构》
班级: 1723
姓名: 于欣月
学号:20172332
实验教师:王志强
实验日期:2018年11月20日
必修/选修: 必修html

1.实验内容

  • 查找与排序-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程序对各类查找与排序算法进行测试
    提交运行结果截图
    推送代码到码云
    (加分3,加到实验中)

2. 实验过程及结果

前期准备:

  • 1.了解多种查找方法与排序方法的原理及实现

过程:

  • 1.实验一
    • 关键代码:
public static <T> boolean linearSearch(T[] data, int min, int max, T target) {
        int index = min;
        boolean found = false;

        while (!found && index <= max) {
            found = data[index].equals(target);
            index++;
        }

        return found;
    }
//线性查找
public static <T> boolean linearSearch(T[] data, int min, int max, T target) {
        int index = min;
        boolean found = false;

        while (!found && index <= max) {
            found = data[index].equals(target);
            index++;
        }

        return found;
    }
//选择排序
public static <T extends Comparable<T>>
        String selectionSort(T[] data)
    {
        int min;
        T temp;

        for (int index = 0; index < data.length-1; index++)
        {
            min = index;
            for (int scan = index+1; scan < data.length; scan++)
                if (data[scan].compareTo(data[min])<0)
                    min = scan;

            swap(data, min, index);
        }
        String res = "";
        for(int i = 0;i<data.length;i++)
            res += data[i]+",";
        return res;
    }
- 实验结果:

  • 2.实验二
    • 关键代码:
      与实验一相同。
    • 实验结果:java

  • 3.实验三
    • 关键代码:
/**
     * Searches the specified array of objects using a binary search
     * algorithm.
     *
     * @param data   the array to be searched
     * @param min    the integer representation of the minimum value
     * @param max    the integer representation of the maximum value
     * @param target the element being searched for
     * @return true if the desired element is found
     */
    //二分查找
    public static <T extends Comparable<T>> boolean binarySearch(T[] data, int min, int max, T target) {
        boolean found = false;
        int midpoint = (min + max) / 2;  // determine the midpoint

        if (data[midpoint].compareTo(target) == 0)
            found = true;

        else if (data[midpoint].compareTo(target) > 0) {
            if (min <= midpoint - 1)
                found = binarySearch(data, min, midpoint - 1, target);
        } else if (midpoint + 1 <= max)
            found = binarySearch(data, midpoint + 1, max, target);

        return found;
    }

    //顺序查找
    public static int SequenceSearch(int a[], int value, int n) {
        int i;
        for (i = 0; i < n; i++)
            if (a[i] == value)
                return i;
        return -1;
    }

    //二分查找两个版本
    public static int BinarySearch1(int a[], int value, int n) {
        int low, high, mid;
        low = 0;
        high = n - 1;
        while (low <= high) {
            mid = (low + high) / 2;
            if (a[mid] == value)
                return mid;
            if (a[mid] > value)
                high = mid - 1;
            if (a[mid] < value)
                low = mid + 1;
        }
        return -1;
    }

    //二分查找,递归版本
    public static int BinarySearch2(int a[], int value, int low, int high) {
        if (high < low)
            return -1;
        int mid = low + (high - low) / 2;
        if (a[mid] == value)
            return mid;
        else if (a[mid] > value)
            return BinarySearch2(a, value, low, mid - 1);
        else if (a[mid] < value)
            return BinarySearch2(a, value, mid + 1, high);
        else
            return -1;
    }

    //插值查找
    public static int InsertionSearch(int[] data, int target, int min, int max) {
        if (min == max)
            return -1;
        int mid = min + (target - data[min]) / (data[max] - data[min]) * (max - min);
        if (data[mid] == target)
            return mid;
        else if (data[mid] > target)
            return InsertionSearch(data, target, min, mid - 1);
        else if (data[mid] < target)
            return InsertionSearch(data, target, mid + 1, max);
        else
            return -1;
    }

    //斐波那契查找
    private static int[] fibonacci() {
        int[] f = new int[10];
        f[0] = 0;
        f[1] = 1;
        for (int i = 2; i < f.length; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

    public static int fibonacciSearch(int[] data, int key) {
        int low = 0;
        int high = data.length - 1;
        int mid = 0;
        // 斐波那契分割数值下标
        int k = 0;
        // 序列元素个数
        int i = 0;
        // 获取斐波那契数列
        int[] f = fibonacci();
        // 获取斐波那契分割数值下标
        while (data.length > f[k] - 1) {
            k++;
        }

        // 建立临时数组
        int[] temp = new int[f[k] - 1];
        for (int j = 0; j < data.length; j++)
            temp[j] = data[j];

        // 序列补充至f[k]个元素
        // 补充的元素值为最后一个元素的值
        for (i = data.length; i < f[k] - 1; i++) {
            temp[i] = temp[high];
        }

        while (low <= high) {
            // low:起始位置
            // 前半部分有f[k-1]个元素,因为下标从0开始
            // 则-1 获取 黄金分割位置元素的下标
            mid = low + f[k - 1] - 1;

            if (temp[mid] > key) {
                // 查找前半部分,高位指针移动
                // (所有元素) = (前半部分)+(后半部分)
                // f[k] = f[k-1] + f[k-1]
                // 由于前半部分有f[k-1]个元素,因此 k = k-1
                high = mid - 1;
                k = k - 1;

            } else if (temp[mid] < key) {
                // 查找后半部分,高位指针移动
                // (所有元素) = (前半部分)+(后半部分)
                // f[k] = f[k-1] + f[k-1]
                // 由于后半部分有f[k-1]个元素,因此 k = k-2
                low = mid + 1;
                k = k - 2;
            } else {
                // 若是为真则找到相应的位置
                if (mid <= high) {
                    return mid;
                } else {
                    // 出现这种状况是查找到补充的元素
                    // 而补充的元素与high位置的元素同样
                    return high;
                }
            }
        }
        return -1;
    }

    public static int treeSearch(int[] arr, int key) {
        LinkedBinarySearchTree tree = new LinkedBinarySearchTree();
        for (int a = 0; a < arr.length; a++) {
            tree.addElement(arr[a]);
        }
        if (tree.find(key) != null)
            return (int) tree.find(key);
        else
            throw new ElementNotFoundException();
    }

    //分块查找
    //index表明索引数组,st2表明待查找数组,keytype表明要查找的元素,m表明每块大小
    public static int blocksearch(int[] index, int[] st2, int keytype, int m) {
        int i = linearSearch(index, 0, st2.length - 1, keytype);    //shunxunsearch函数返回值为带查找元素在第几块
        if (i >= 0) {
            int j = m * i;   //j为第i块的第一个元素下标
            int curlen = (i + 1) * m;
            while (j < curlen) {
                if (st2[j] == keytype)
                    return j;
                j++;
            }
        }
        return -1;
    }

    public static <T> int linearSearch(int[] data, int min, int max, int target) {
        int index = min;

        if (data[index] >= target)
            return 0;
        int i=1;
        while(i<data.length) {
            if((data[i-1]<target)&&(data[i]>target))
                return i;
            else
                i++;
        }
        return -1;
    }

    //哈希查找
    public static int hashSearch(int data[], int target) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < data.length; i++)
            hashMap.put(Integer.hashCode(data[i]), data[i]);

        int key = Integer.hashCode(target);
        if (hashMap.containsKey(key))
            return hashMap.get(key);

        return -1;//找不到返回-1
    }
- 实验结果:

  • 实验四
    • 关键代码:
public static <T extends Comparable<T>>
        String selectionSort(T[] data)
    {
        int min;
        T temp;

        for (int index = 0; index < data.length-1; index++)
        {
            min = index;
            for (int scan = index+1; scan < data.length; scan++)
                if (data[scan].compareTo(data[min])<0)
                    min = scan;

            swap(data, min, index);
        }
        String res = "";
        for(int i = 0;i<data.length;i++)
            res += data[i]+",";
        return res;
    }

    /**
     * Swaps to elements in an array. Used by various sorting algorithms.
     *
     * @param data   the array in which the elements are swapped
     * @param index1 the index of the first element to be swapped
     * @param index2 the index of the second element to be swapped
     */
    private static <T extends Comparable<T>> void swap(T[] data, int index1, int index2)
    {
        T temp = data[index1];
        data[index1] = data[index2];
        data[index2] = temp;
    }
    
    /**
     * Sorts the specified array of objects using an insertion
     * sort algorithm.
     *
     * @param data the array to be sorted
     */
    public static <T extends Comparable<T>> void insertionSort(T[] data)
    {
        for (int index = 1; index < data.length; index++)
        {
            T key = data[index];
            int position = index;

            // shift larger values to the right
            while (position > 0 && data[position-1].compareTo(key) > 0)
            {
                data[position] = data[position-1];
                position--;
            }

            data[position] = key;
        }
    }

    /**
     * Sorts the specified array of objects using a bubble sort
     * algorithm.
     *
     * @param data the array to be sorted
     */
    public static <T extends Comparable<T>> void bubbleSort(T[] data)
    {
        int position, scan;
        T temp;

        for (position =  data.length - 1; position >= 0; position--)
        {
            for (scan = 0; scan <= position - 1; scan++)
            {
                if (data[scan].compareTo(data[scan+1]) > 0)
                    swap(data, scan, scan + 1);
            }
        }
    }

    /**
     * Sorts the specified array of objects using the merge sort
     * algorithm.
     *
     * @param data the array to be sorted
     */
    public static <T extends Comparable<T>> void mergeSort(T[] data)
    {
        mergeSort(data, 0, data.length - 1);
    }

    /**
     * Recursively sorts a range of objects in the specified array using the
     * merge sort algorithm.
     *
     * @param data the array to be sorted
     * @param min  the index of the first element
     * @param max  the index of the last element
     */
    private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max)
    {
        if (min < max)
        {
            int mid = (min + max) / 2;
            mergeSort(data, min, mid);
            mergeSort(data, mid+1, max);
            merge(data, min, mid, max);
        }
    }

    /**
     * Merges two sorted subarrays of the specified array.
     *
     * @param data the array to be sorted
     * @param first the beginning index of the first subarray
     * @param mid the ending index fo the first subarray
     * @param last the ending index of the second subarray
     */
    @SuppressWarnings("unchecked")
    private static <T extends Comparable<T>> void merge(T[] data, int first, int mid, int last)
    {
        T[] temp = (T[])(new Comparable[data.length]);

        int first1 = first, last1 = mid;  // endpoints of first subarray
        int first2 = mid+1, last2 = last;  // endpoints of second subarray
        int index = first1;  // next index open in temp array

        //  Copy smaller item from each subarray into temp until one
        //  of the subarrays is exhausted
        while (first1 <= last1 && first2 <= last2)
        {
            if (data[first1].compareTo(data[first2]) < 0)
            {
                temp[index] = data[first1];
                first1++;
            }
            else
            {
                temp[index] = data[first2];
                first2++;
            }
            index++;
        }

        //  Copy remaining elements from first subarray, if any
        while (first1 <= last1)
        {
            temp[index] = data[first1];
            first1++;
            index++;
        }

        //  Copy remaining elements from second subarray, if any
        while (first2 <= last2)
        {
            temp[index] = data[first2];
            first2++;
            index++;
        }

        //  Copy merged data into original array
        for (index = first; index <= last; index++)
            data[index] = temp[index];
   }

    /**
     * Sorts the specified array of objects using the quick sort algorithm.
     *
     * @param data the array to be sorted
     */
    public static <T extends Comparable<T>> void quickSort(T[] data)
    {
        quickSort(data, 0, data.length - 1);
    }

    /**
     * Recursively sorts a range of objects in the specified array using the
     * quick sort algorithm.
     *
     * @param data the array to be sorted
     * @param min  the minimum index in the range to be sorted
     * @param max  the maximum index in the range to be sorted
     */
    private static <T extends Comparable<T>> void quickSort(T[] data, int min, int max)
    {
        if (min < max)
        {
            // create partitions
            int indexofpartition = partition(data, min, max);

            // sort the left partition (lower values)
            quickSort(data, min, indexofpartition - 1);

            // sort the right partition (higher values)
            quickSort(data, indexofpartition + 1, max);
        }
    }

    /**
     * Used by the quick sort algorithm to find the partition.
     *
     * @param data the array to be sorted
     * @param min  the minimum index in the range to be sorted
     * @param max  the maximum index in the range to be sorted
     */
    private static <T extends Comparable<T>> int partition(T[] data, int min, int max)
    {
        T partitionelement;
        int left, right;
        int middle = (min + max) / 2;

        // use the middle data value as the partition element
        partitionelement = data[middle];
        // move it out of the way for now
        swap(data, middle, min);

        left = min;
        right = max;

        while (left < right)
        {
            // search for an element that is > the partition element
            while (left < right && data[left].compareTo(partitionelement) <= 0)
                left++;

            // search for an element that is < the partition element
            while (data[right].compareTo(partitionelement) > 0)
                right--;

            // swap the elements
            if (left < right)
                swap(data, left, right);
        }

        // move the partition element into place
        swap(data, min, right);

        return right;
    }
    public static String Xiersort(int[] arrays){
        String res = "";
        if(arrays == null || arrays.length <= 1){
            return null;
        }
        //增量
        int incrementNum = arrays.length/2;
        while(incrementNum >=1){
            for(int i=0;i<arrays.length;i++){
                //进行插入排序
                for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){
                    if(arrays[j]>arrays[j+incrementNum]){
                        int temple = arrays[j];
                        arrays[j] = arrays[j+incrementNum];
                        arrays[j+incrementNum] = temple;
                    }
                }
            }
            //设置新的增量
            incrementNum = incrementNum/2;
        }
        for (int i = 0;i<arrays.length;i++)
            res+=arrays[i]+" ";
        return res;
    }
public void heapSort() {
        int[] a = {2,4,1,9,3,23,32};
        assertEquals("1 2 3 4 9 23 32 ", HeapSort.HeapSort(a));
    }
public static void main(String[] args) {
        int[] num = {5,1,0,9,7,36,24,15,23,32};
        LinkedBinarySearchTree a = new LinkedBinarySearchTree(num[0]);
        for(int i = 1;i<num.length;i++)
            a.addElement(num[i]);
        a.inOrder(a.root);
        System.out.println();
        Integer[] nu ={5,1,0,9,7,36,24,15,23,32};
        Sorting.quickSort(nu);
        for (int o = 0;o<nu.length;o++)
            System.out.print(nu[o]+" ");
        Sorting.insertionSort(nu);
        for (int o = 0;o<nu.length;o++)
            System.out.print(nu[o]+" ");
        Sorting.selectionSort(nu);
        for (int o = 0;o<nu.length;o++)
            System.out.print(nu[o]+" ");
        Sorting.bubbleSort(nu);
        for (int o = 0;o<nu.length;o++)
            System.out.print(nu[o]+" ");
        Sorting.mergeSort(nu);
        for (int o = 0;o<nu.length;o++)
            System.out.print(nu[o]+" ");
    }
- 实验结果:








  • 实验五
    • 关键代码:
      基本与idea中的没变,只是加了布局文件。
    • 实验结果:算法
















3. 实验过程当中遇到的问题和解决过程

  • 问题1:数组

  • 问题1解决方案:T不兼容Comparable型,因此须要改成Integer型的数组。数据结构

其余(感悟、思考等)

  • 我以为此次的实验由于学完的过久了,因此有些方法不记得原理了,就又翻了一遍书,正好温习了一下。可是实验总体的难度并不大,原理都清楚就是代码实现的问题,须要花一些时间。

参考资料

相关文章
相关标签/搜索