1. 程式人生 > >20172324 2018-2019-1《程式設計與資料結構》實驗三報告

20172324 2018-2019-1《程式設計與資料結構》實驗三報告

20172324 2018-2019-1《程式設計與資料結構》實驗三報告

課程:《程式設計與資料結構》
班級: 1723
姓名: 曾程
學號:20172324
實驗教師:王志強
實驗日期:2018年11月19日
必修/選修: 必修

一、實驗內容

連結串列練習

  • 實驗一:定義一個Searching和Sorting類,並在類中實現linearSearch(教材P162 ),SelectionSort方法(P169),最後完成測試。

    1. 要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位提交執行結果圖。
  • 實驗二:重構你的程式碼把Sorting.java Searching.java放入cn.edu.besti.cs1723.(姓名首字母+四位學號)包中(例如:cn.edu.besti.cs1723.G2301)把測試程式碼放test包中
    1. 重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)
  • 實驗三:參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查詢演算法並測試提交執行結果截圖

  • 實驗四:補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
    1. 測試實現的演算法(正常,異常,邊界)
      提交執行結果截圖
  • 實驗五:編寫Android程式對各種查詢與排序演算法進行測試
    提交執行結果截圖3

二、實驗過程及結果

  • 實驗1結果截圖:

    • 定義Searching和Sorting類都已經在原來的程式碼裡編寫過了,唯一需要進行的就是測試程式碼,正常情況正序逆序都還比較容易理解,但是邊界情況和異常情況不是很清楚,邊界就是說如果給出{"A"、"B"、"C"、"D"、"E"}這一個陣列,A和E就是邊界;異常情況就是空指標等情況





  • 實驗2結果截圖:

    • 在命令列中執行程式碼並完成編譯

    • 將Sorting.java和Seaching.java放在另一個包裡

  • 實驗3結果截圖:

    • 該實驗需要補充的其實就是插值查詢、斐波那契查詢和分塊查詢
    • 對於有序列表,插值查詢的平均效能更好。具體實現程式碼如下:
 public static int InsertionSearch(int[] a, int value, int low, int high) {
        int mid = low + (value - a[low]) / (a[high] - a[low]) * (high - low);
        if (a[mid] == value)
            return mid;
        if (a[mid] > value)
            return InsertionSearch(a, value, low, mid - 1);
        else
            return InsertionSearch(a, value, mid + 1, high);
    }
  • 斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、····,在數學上,斐波那契被遞迴方法如下定義:F(1)=1,F(2)=1,F(n)=f(n-1)+F(n-2) (n>=2)。該數列越往後相鄰的兩個數的比值越趨向於黃金比例值(0.618)。
    斐波那契查詢就是在二分查詢的基礎上根據斐波那契數列進行分割的。在斐波那契數列找一個等於略大於查詢表中元素個數的數F[n],將原查詢表擴充套件為長度為Fn,完成後進行斐波那契分割,即F[n]個元素分割為前半部分F[n-1]個元素,後半部分F[n-2]個元素,找出要查詢的元素在那一部分並遞迴,直到找到。具體實現如下:
public static boolean FibonacciSearch(int[] table, int keyWord) {
        //確定需要的斐波那契數
        int i = 0;
        while (getFibonacci(i) - 1 == table.length) {
            i++;
        }
        //開始查詢
        int low = 0;
        int height = table.length - 1;
        while (low <= height) {
            int mid = low + getFibonacci(i - 1);
            if (table[mid] == keyWord) {
                return true;
            } else if (table[mid] > keyWord) {
                height = mid - 1;
                i--;
            } else if (table[mid] < keyWord) {
                low = mid + 1;
                i -= 2;
            }
        }
        return false;
    }
    //得到第n個斐波那契數
    public static int getFibonacci(int n) {
        int res = 0;
        if (n == 0) {
            res = 0;
        } else if (n == 1) {
            res = 1;
        } else {
            int first = 0;
            int second = 1;
            for (int i = 2; i <= n; i++) {
                res = first + second;
                first = second;
                second = res;
            }
        }
        return res;
    }

  • 實驗4結果截圖:
    • 這個實驗上課的時候就實現過