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功能的使用介紹