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

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

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

班級: 1723java

姓名: 王文彬linux

學號:20172329git

實驗教師:王志強算法

實驗日期:2018年11月19日vim

必修/選修: 必修bash

1、實驗內容

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、實驗過程

2.1 第一個實驗過程

過程數據結構

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

結果:編輯器




2.2 第二個實驗過程

過程ide

  • (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)第四個實驗是補充上課講過的排序算法,我一共寫了堆排序,二叉樹排序,希爾排序,這三種新的方法,加上當時學習的選擇排序,插入排序,冒泡排序,歸併排序,一種七種,其中對於三種新算法進行了編寫和測試:
    一、堆排序
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;
    }

二、希爾排序

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

三、二叉樹排序

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
    結果:



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

  • 問題1:主要是在沒有了虛擬機,學習瞭如何在電腦自己的bash上進行命令行操做
  • 問題1解決方案:
    • 一、首先咱們的電腦裏必須具備java的jdk,這樣咱們才能夠在bash裏輸入java時有正確回覆;如圖1
    • 二、而後咱們須要找到咱們寫好的java文件,不管是用vim編輯器仍是在文檔中寫好改成Java文件,咱們首先依舊須要將這個文件進行javac的
      操做,也就是編譯的操做,而後咱們就產生了class文件,而後咱們就能夠繼續了。如圖2
    • 三、在咱們準備運行這個class文件的時候,這個咱們須要退出到上一級文件進行運行,假如咱們進入到這個class文件所在的目錄,就會跳出找不到或沒法運行的錯誤,具體緣由應該是指定路徑設定的問題。如圖3

圖1

圖2

圖3

感想

又是接近了期末,本身最近由於事情愈來愈多,打亂了本身的安排,但願本身能夠找到節奏,繼續加油!

參考資料

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

相關文章
相關標籤/搜索