《程式設計與資料結構》實驗三報告
阿新 • • 發佈:2018-12-04
學號 2017-2018-2 《程式設計與資料結構》實驗三報告
課程:《程式設計與資料結構》
班級: 1723
姓名: 康皓越
學號:20172326
實驗教師:王志強
實驗日期:2018年11月19日
必修/選修: 必修
1.實驗內容
- 實驗1:
定義一個Searching和Sorting類,並在類中實現linearSearch(教材P162),SelectionSort方法(P169),最後完成測試。要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
提交執行結果圖。 - 實驗2:
重構你的程式碼。把Sorting.java Searching.java放入cn.edu.besti.cs1723.(姓名首字母+四位學號)包中(例如:cn.edu.besti.cs1723.G2301)把測試程式碼放test包中,重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)。 - 實驗3:
參考
部落格,補充查詢演算法,提交執行結果截圖。 - 實驗4:
補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)測試實現的演算法(正常,異常,邊界),提交執行結果截圖。 實驗5:
編寫Android程式對各種查詢與排序演算法進行測試,提交執行結果截圖,推送程式碼到碼雲。2. 實驗過程及結果
實驗一
- 利用JUnit進行測試,所需的linearSearch、SelectionSort之前已經寫好,只需要根據要求進行測試即可。可以提前設定好需要傳入equals方法的引數,也可以直接在方法中寫。
- 以下是各種測試的情況:
實驗二
- 在虛擬機器Linux上進行相關操作,程式碼都是已經寫好的,但是虛擬機器出了很多問題,費了一番功夫後就弄好了。
- 這些是在虛擬機器上進行建包、測試的結果截圖:
實驗三
- 除了書上介紹過的查詢演算法外,這篇部落格還介紹了插值查詢和斐波那契查詢,雖然給出的是C語言程式碼,但是我們依舊可以理解,並在此基礎上給出Java的程式碼。其中斐波那契查詢是二分查詢的一種變形,將黃金比例的思想運用在分割陣列中,從而提高了效率。
- 實驗程式碼與實驗結果:
public void Fibonacci(int a[]) { a = b; a[0] = 0; a[1] = 1; for (int i = 2; i < a.length; i++) a[i] = a[i - 1] + a[i - 2]; } public int FibonacciSearch(int array[],int key) //a為要查詢的陣列,n為要查詢的陣列長度,key為要查詢的關鍵字 { 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] > key) { hight = middle - 1; k = k - 1; } else if (temp[middle] < key) { low = middle + 1; k = k - 2; } else { if (middle <= hight) { return middle;// 此時mid即為查詢到的位置 } else { return hight;// 此時middle的值已經大於hight,進入擴充套件陣列的填充部分,即最後一個數就是要查詢的數。 } } } return -1; } }
實驗四
- 補充排序方法,並進行測試。
- 在之前已經實現的二叉查詢樹和堆的基礎上,進行排序。希爾排序,是插入排序的一種變形,我們可以發現,插入排序每次將兩個相鄰的元素進行比較,然後再根據大小調整。而希爾排序通過將設定一個值,並不斷減小其大小,使得一個無序陣列不斷趨於有序,這樣一來,在初始值變為1時,也就是最終執行插入排序時,整個陣列已經較為有序,從而提高排序的效率。
- 以下是補充的程式碼和測試結果:
public String HeapSort(Object a[]){
String res="";
HeapSort heapSort= new HeapSort();
heapSort.HeapSort(a);
for(int i2 =a.length-1;i2>=0;i2--){
res += a[i2]+" ";
}
return res;
}
public <T extends Comparable<T>> String BinaryTreeSort(T a[]){
Comparable[] B = a;
LinkedBinarySearchTree lbst = new LinkedBinarySearchTree();
String res="";
for(int i=0;i<a.length;i++){
lbst.addElement(B[i]);
}
Object[] sortarray = new Object[a.length];
for (int i =0;i<a.length;i++){
sortarray[i]=lbst.removeMin();
}
for(int i2 =0;i2<sortarray.length;i2++){
res += sortarray[i2]+" ";
}
return res;
}
public <T extends Comparable<T>> String ShellSort(T[] data, int i){
int gap = i;
int length = data.length;
String res="";
while(gap>=1){
for(int index=0;index<length-gap;index++){
if(data[index].compareTo(data[index+gap])>0)
swap(data,index,index+i);
count2++;
}
gap=gap-1;
ShellSort(data,gap);
}
for(int i2 =0;i2<data.length;i2++){
res += data[i]+" ";
}
return res;
}
實驗五
- 將查詢排序程式碼在安卓上實現,很久沒有接觸安卓,很多操作、方法都已經遺忘,所以從頭複習了一遍一些基本的方法,然後將其移植在了安卓上。
- 實驗結果,因為較多,就不一一展示,在此節選了部分:
3. 實驗過程中遇到的問題和解決過程
- 類轉化丟擲異常
在進行測試時,需要傳入引數,因此,將程式碼部分進行了修改,將方法頭申明的泛型改為了具體的資料型別。之後就丟擲了異常。按理說,Object類是所有類的父類,但是卻不能轉化為comparable。為了使前後資料型別相同,我將陣列申明為了Object型,但是,我們知道子類可以繼承父類的性質,但是,子類的性質父類不一定會有,所以,將我們可以將傳入一個comparable的陣列,而不是一個object型的。
其他(感悟、思考等)
- 這次實驗主要是增強了對相關演算法的理解,同時熟悉了AndroidStudio的部分基礎操作