《程序設計與數據結構》實驗三報告

學號 2017-2018-2 《程序設計與數據結構》實驗三報告

課程:《程序設計與數據結構》

班級: 1723
姓名: 康皓越
學號:20172326
實驗教師:王志強
實驗日期:2018年11月19日
必修/選修: 必修

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:
    參考
    博客,補充查找算法,提交運行結果截圖。
  • 實驗4:
    補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)測試實現的算法(正常,異常,邊界),提交運行結果截圖。
  • 實驗5:
    編寫Android程序對各類查找與排序算法進行測試,提交運行結果截圖,推送代碼到碼雲。html

    2. 實驗過程及結果

    實驗一

  • 利用JUnit進行測試,所需的linearSearch、SelectionSort以前已經寫好,只須要根據要求進行測試便可。能夠提早設置好須要傳入equals方法的參數,也能夠直接在方法中寫。
  • 如下是各類測試的狀況:


實驗二

  • 在虛擬機Linux上進行相關操做,代碼都是已經寫好的,可是虛擬機出了不少問題,費了一番功夫後就弄好了。
  • 這些是在虛擬機上進行建包、測試的結果截圖:



實驗三

  • 除了書上介紹過的查找算法外,這篇博客還介紹了插值查找和斐波那契查找,雖然給出的是C語言代碼,可是咱們依舊能夠理解,並在此基礎上給出Java的代碼。其中斐波那契查找是二分查找的一種變形,將黃金比例的思想運用在分割數組中,從而提升了效率。
  • 實驗代碼與實驗結果:
public void Fibonacci(int a[]) {
        a = b;
        a[0] = 0;
        a[1] = 1;
        for (int i = 2; i < a.length; i++)
            a[i] = a[i - 1] + a[i - 2];
    }

    public int FibonacciSearch(int array[],int key)  //a爲要查找的數組,n爲要查找的數組長度,key爲要查找的關鍵字
    {
        if (array == null || array.length == 0) {
            return -1;
        } else {
            int length = array.length;
            int[] fb = makeFbArray(length + 2);
            int k = 0;
            while (length > fb[k] - 1) {// 找出數組的長度在斐波數列(減1)中的位置,將決定如何拆分
                k++;
            }
            int[] temp = Arrays.copyOf(array, fb[k] - 1);
            for (int i = length; i < temp.length; i++) {
                if (i >= length) {
                    temp[i] = array[length - 1];
                }
            }
            int low = 0;
            int hight = array.length - 1;
            while (low <= hight) {
                int middle = low + fb[k - 1] - 1;
                if (temp[middle] > key) {
                    hight = middle - 1;
                    k = k - 1;
                } else if (temp[middle] < key) {
                    low = middle + 1;
                    k = k - 2;
                } else {
                    if (middle <= hight) {
                        return middle;// 此時mid即爲查找到的位置
                    } else {
                        return hight;// 此時middle的值已經大於hight,進入擴展數組的填充部分,即最後一個數就是要查找的數。
                    }
                }
            }
            return -1;
        }
    }

實驗四

  • 補充排序方法,並進行測試。
  • 在以前已經實現的二叉查找樹和堆的基礎上,進行排序。希爾排序,是插入排序的一種變形,咱們能夠發現,插入排序每次將兩個相鄰的元素進行比較,而後再根據大小調整。而希爾排序經過將設置一個值,並不斷減少其大小,使得一個無序數組不斷趨於有序,這樣一來,在初始值變爲1時,也就是最終執行插入排序時,整個數組已經較爲有序,從而提升排序的效率。
  • 如下是補充的代碼和測試結果:
public String HeapSort(Object a[]){
        String res="";
        HeapSort heapSort= new HeapSort();
        heapSort.HeapSort(a);

        for(int i2 =a.length-1;i2>=0;i2--){
            res += a[i2]+" ";
        }
        return res;
    }

    public <T extends Comparable<T>> String BinaryTreeSort(T a[]){
        Comparable[] B = a;
        LinkedBinarySearchTree lbst = new LinkedBinarySearchTree();
        String res="";
        for(int i=0;i<a.length;i++){
            lbst.addElement(B[i]);
        }

        Object[] sortarray = new Object[a.length];
        for (int i =0;i<a.length;i++){
            sortarray[i]=lbst.removeMin();
        }

        for(int i2 =0;i2<sortarray.length;i2++){
            res += sortarray[i2]+" ";
        }
        return res;
    }


    public  <T extends Comparable<T>> String ShellSort(T[] data, int i){
        int gap = i;
        int length = data.length;
        String res="";

        while(gap>=1){

            for(int index=0;index<length-gap;index++){
                if(data[index].compareTo(data[index+gap])>0)
                    swap(data,index,index+i);
                count2++;
            }
            gap=gap-1;
            ShellSort(data,gap);
        }
        for(int i2 =0;i2<data.length;i2++){
            res += data[i]+" ";
        }
        return res;
    }

實驗五

  • 將查找排序代碼在安卓上實現,好久沒有接觸安卓,不少操做、方法都已經遺忘,因此從頭複習了一遍一些基本的方法,而後將其移植在了安卓上。
  • 實驗結果,由於較多,就不一一展現,在此節選了部分:




3. 實驗過程當中遇到的問題和解決過程

  • 類轉化拋出異常
  • 在進行測試時,須要傳入參數,所以,將代碼部分進行了修改,將方法頭申明的泛型改成了具體的數據類型。以後就拋出了異常。按理說,Object類是全部類的父類,可是卻不能轉化爲comparable。爲了使先後數據類型相同,我將數組申明爲了Object型,可是,咱們知道子類能夠繼承父類的性質,可是,子類的性質父類不必定會有,因此,將咱們能夠將傳入一個comparable的數組,而不是一個object型的。java

其餘(感悟、思考等)

  • 此次實驗主要是加強了對相關算法的理解,同時熟悉了AndroidStudio的部分基礎操做

參考資料

相關文章
相關標籤/搜索