20172313 2018-2019-1 《程序設計與數據結構》實驗三報告

20172313 2018-2019-1 《程序設計與數據結構》實驗三報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 餘坤澎
學號:20172313
實驗教師:王志強
實驗日期:2018年11月20日
必修/選修: 必修html

1.實驗內容

  • 實驗一 定義一個Searching和Sorting類,並在類中實現linearSearch(教材P162 ),SelectionSort方法(P169),最後完成測試。要求很多於10個測試用例,提交測試用例設計狀況(正常,異常,邊界,正序,逆序),用例數據中要包含本身學號的後四位提交運行結果圖。
  • 實驗二 重構你的代碼把Sorting.java Searching.java放入 cn.edu.besti.cs1723.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1723.G2301)把測試代碼放test包中
    從新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)
  • 實驗三 參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試提交運行結果截圖
  • 實驗四 補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)測試實現的算法(正常,異常,邊界)。提交運行結果截圖
  • 實驗五 編寫Android程序對各類查找與排序算法進行測試,提交運行結果截圖,推送代碼到碼雲。

2. 實驗過程及結果

實驗一

  • 實驗一大致上來講沒有什麼難度,相應的代碼在以前也有練習過,實驗一主要是用來複習Junit測試,在進行Junit測試的時候要注意測試用例的設計,要囊括各類狀況:正常、異常、邊界、正序、逆序。以確保代碼的正確性。

實驗二

  • 實驗二重構代碼只是將代碼放到其餘的包中,在IDEA下運行只須要簡單的拖拉,複製粘貼便可完成,在命令行下實現花了一番功夫,過久沒有在Linux下進行代碼的編寫,指令也有些忘記,複習了Linux的操做後,實驗二也就OK了!

實驗三

  • 實驗三的難度有所增長,其餘的查找算法以前也有寫過,這裏主要是斐波那契查找比較陌生,這種查找的精髓在於採用最接近查找長度的斐波那契數值來肯定拆分點,也就是利用到了黃金比例。詳細的代碼分析和理解在下文的實驗問題中將會提到。
//斐波那契查找
    public int fbSearch(int[] array, int a) {
        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] > a) {
                    hight = middle - 1;
                    k = k - 1;
                } else if (temp[middle] < a) {
                    low = middle + 1;
                    k = k - 2;
                } else {
                    if (middle <= hight) {
                        return middle;// 此時mid即爲查找到的位置
                    } else {
                        return hight;// 此時middle的值已經大於hight,進入擴展數組的填充部分,即最後一個數就是要查找的數。
                    }
                }
            }
            return -1;
        }
    }

    //生成一個指定長度的斐波數列
    public int[] makeFbArray(int length) {
        int[] array = null;
        if (length > 2) {
            array = new int[length];
            array[0] = 1;
            array[1] = 1;
            for (int i = 2; i < length; i++) {
                array[i] = array[i - 1] + array[i - 2];
            }
        }
        return array;
    }

實驗四

  • 實驗四要求實現補充課上所講的排序方法,我在這裏的主要思路就是每次找到最小值依次進行輸出,最後獲得排序好的結果。實驗四也就完成了。

實驗五

  • 要求使用android studio進行測試,由於期末做業的緣故,因此對android studio的操做也進行了複習,因此在代碼從IDEA移植到android studio並設計了圖形界面沒什麼困難和問題。

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

  • 問題一:在作實驗三的時候對斐波那契查找比較陌生,不是很是明白他的具體操做步驟。
  • 問題一解決方案:既然是斐波那契查找法,咱們首先須要知道斐波那契數列到底是什麼。java

    斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」,指的是這樣一個數列:一、一、二、三、五、八、1三、2一、3四、……在數學上,斐波納契數列以以下被以遞歸的方法定義:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)android

通俗的來說,就是從第3個數開始,每個數都等於它前面的兩個數的和,而斐波那契查找則正是利用了它的性質,前一個數除以相鄰的後一個數,比值無限接近黃金分割。如今假設咱們有這樣一個數列,它的長度爲9(數值任意),則它對應的斐波那契數列爲{1,1,2,3,5,8,13,21,34}(長度要大於等於9),大於9且最接近9的斐波那契數值是f[6]=13,爲了知足所謂的黃金分割,因此它的第一個拆分點應該就是f[6]的前一個值f[5]=8,即待查找數組array的第8個數,對應到下標就是array[7],依次類推。推演到通常狀況,假設有待查找數組array[n]和斐波那契數組F[k],而且n知足n>=F[k]-1&&n < F[k+1]-1,則它的第一個拆分點middle=F[k]-1。若是n恰好等於F[k]-1,待查找數組恰好拆成F[k-1]和F[k-2]兩部分;然而大多數狀況並不能盡人意,n會小於F[k]-1,這時候咱們須要使用補齊,用最大的數來填充F[k-2]的殘缺部分,若是查找的位置落到補齊的部分,那就能夠肯定要找的那個數就是最後一個最大的了。算法

其餘

  此次實驗整體上來講難度不大,不少都是以前聯繫過的內容,在此次實驗中主要是複習了Juni測試,命令行使用以及androidstudio的使用。在此次實驗中仍是發現了本身的不足,沒有對以往的內容進行很好的複習。但願在此次認識到本身的不足後可以加以改正,在之後的學習生活中繼續進步。數組

參考資料

相關文章
相關標籤/搜索