20172329 2018-2019 《Java軟件結構與數據結構》實驗三報告

20172329 2018-2019-2 《Java軟件結構與數據結構》實驗三報告

課程:《Java軟件結構與數據結構》

班級: 1723

姓名: 王文彬

學號:20172329

實驗教師:王志強

實驗日期:2018年11月19日

必修/選修: 必修

一、實驗內容

1.1 第一個實驗內容

  • 要求
    • (1)定義一個Searching和Sorting類,並在類中實現linearSearch(教材P162 ),SelectionSort方法(P169),最後完成測試。
    • (2)要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例數據中要包含自己學號的後四位
    • (3)提交運行結果圖。(2分)

1.2 第二個實驗內容

  • 要求
    • (1)重構你的代碼把Sorting.java Searching.java放入 cn.edu.besti.cs1723.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1723.G2301)把測試代碼放test包中
    • (2)重新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)(2分)

1.3 第三個實驗內容

  • 要求
    • (1)參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試提交運行結果截圖(3分)

1.4 第四個實驗內容

  • 要求
    • (1)補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
    • (2)測試實現的算法(正常,異常,邊界)提交運行結果截圖(3分,如果編寫多個排序算法,即使其中三個排序程序有瑕疵,也可以酌情得滿分)

1.5 第五個實驗內容

  • 要求
    • (1)編寫Android程序對各種查找與排序算法進行測試提交運行結果截圖推送代碼到碼雲(加分3,加到實驗中)

二、實驗過程

2.1 第一個實驗過程

過程

  • (1)因爲之前已經寫好過排序和查找的算法,所以不算陌生,就進行了junit測試

結果:




2.2 第二個實驗過程

過程

  • (1)第二個實驗的主要任務是,首先要重構代碼,然後重新編譯然後進行在虛擬機和idea上進行再一次的測試運行
    • 注:學長學姐看這裏!!:因爲mac電腦本身就是unix系統,是linux系統的進階版,所以本身的bash和烏班圖是一樣的,又因爲在新電腦中沒有安裝虛擬機,所以,就在電腦上的bash裏直接進行了測試!!

結果:






2.3 第三個實驗過程

過程

  • 第三個實驗應該是我當時花費時間比較長的一個實驗了,因爲裏面涉及補充沒有聽說過的查找方法:斐波那契額查找。

(1)斐波那契查找

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 =i- 2;
            }
        }
        return false;
    }


    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;
    }

我們在高中就接觸過斐波那契這個人,因爲我們學過一種數列叫做斐波那契數列,其中就像這樣的數列是斐波那契數列:1,1,2,3,5,8,13......., 第三個數字是前兩個數字的和,因爲這樣一個數列在無窮的時候前一個數除以後面的數字會無限接近於0.618,也就是我們的黃金分割數,同樣這個算法的原理也就是基於二分進行開展的,因此我們的這個新的算法斐波那契查找同樣用的也是這個原理,依次進行二分,查找這樣目標,這樣可以最大限度的節省效率,速度很快。

結果:




2.4 第四個實驗過程

過程

  • (1)第四個實驗是補充上課講過的排序算法,我一共寫了堆排序,二叉樹排序,希爾排序,這三種新的方法,加上當時學習的選擇排序,插入排序,冒泡排序,歸併排序,一種七種,其中對於三種新算法進行了編寫和測試:
    1、堆排序
    public static String Heap(Integer[] a){
        ArrayHeap q =new ArrayHeap();
        String result="";
        for (int i =0;i<a.length;i++){
            q.addElement(a[i]);
        }
        for (int i =0;i<a.length;i++){
            result+=q.removeMax()+" ";
        }
        return result;
    }

2、希爾排序

    public static String xiersort(Integer []arr){

    for(int gap=arr.length/2;gap>0;gap/=2){

        for(int i=gap;i<arr.length;i++){
            int j = i;
            while(j-gap>=0 && arr[j]<arr[j-gap]){

                swap(arr,j,j-gap);
                j-=gap;
            }
        }
    }
    return (Arrays.toString(arr));
}

3、二叉樹排序

public static String Seachtree(Integer[] a){
        LinkedBinarySearchTree c =new LinkedBinarySearchTree();
        for (int i =0;i<a.length;i++){
            c.addElement(a[i]);
        }
        String result="";
        for (int i =0;i<a.length;i++){
            result+=c.removeMin()+" ";
        }
        return result;
    }

因爲這幾個方法都比較容易簡單理解並且編寫過程耗費時間較少,所以在這裏就不進行詳細的分析了,相信大家也都能夠理解其中的原理,在這裏我需要提一點的是,希爾排序,這個排序不知道大家還有沒有印象,就是在我們學習排序和查找這一章節的時候,課後習題有一道讓我們編寫叫做間接排序法,這樣一道題,其實這兩個算法有異曲同工之處,在我之前看到的一篇文章裏這樣講,希爾排序是帶有權重(也就是那個間隔)的直接排序,而間隔排序就是帶有間隔的選擇排序法,所以,在我編寫這次的代碼的時候,就可以找到當時寫那個作業的時候的感覺,雖然上次那個題目有問題,最後也不知道如何解決了,但是當我們按照題意編寫的時候,總是感覺有地方有問題,所以在這裏再提醒一下自己不要忘記當時的問題。

結果:







2.5 第五個實驗過程

過程

  • 這次的實驗讓我重新拾起了andriod的編寫,其中忘記了一些,但是大都還是可以想得起來,所以還OK
    結果:



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

  • 問題1:主要是在沒有了虛擬機,學習瞭如何在電腦本身的bash上進行命令行操作
  • 問題1解決方案:
    • 1、首先我們的電腦裏必須具有java的jdk,這樣我們纔可以在bash裏輸入java時有正確回覆;如圖1
    • 2、然後我們需要找到我們寫好的java文件,無論是用vim編輯器還是在文檔中寫好改爲Java文件,我們首先依舊需要將這個文件進行javac的
      操作,也就是編譯的操作,然後我們就產生了class文件,然後我們就可以繼續了。如圖2
    • 3、在我們準備運行這個class文件的時候,這個我們需要退出到上一級文件進行運行,假如我們進入到這個class文件所在的目錄,就會跳出找不到或無法運行的錯誤,具體原因應該是指定路徑設定的問題。如圖3

圖1

圖2

圖3

感想

又是接近了期末,自己最近因爲事情越來越多,打亂了自己的安排,希望自己可以找到節奏,繼續加油!

參考資料

[Data Structure & Algorithm] 七大查找算法
Android Studio的git功能的使用介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章