課程:《Java軟件結構與數據結構》
班級: 1723
姓名: 郭愷
學號:20172301
實驗教師:王志強老師
實驗日期:2018年11月20日
必修/選修: 必修php
實驗一是比較簡單的,代碼是書上的代碼。主要是Junit測試由於很久沒有用過,老是會有一些錯誤,相似junit測試方法前沒有添加test
,或者junit測試的assert方法實現。
測試用例設計狀況(正常,異常,邊界,正序,逆序),關於測試用例,對於排序的異常,是ClassCastException
,是轉換髮生了錯誤。具體是例如1
、2
、3
、4
、a
、b
是不能夠比的,也就是不能排序。
排序應該是沒有邊界測試的。html
對於查找的異常,是ArrayIndexOutOfBoundsException
,是數組越界。即查找範圍超過了數組範圍。
查找應該是沒有逆序測試的。java
實驗一測試結果截圖:
查找測試:
排序測試:
web
藍墨雲連接算法
實驗二首先要移到包裏面,須要注意的是測試類的位置,須要放在項目的test
文件夾中,而且變動目錄爲Test Sources Root
。windows
實驗二測試結果截圖:
數組
藍墨雲連接瀏覽器
七種查找算法分別是:線性查找、二分查找、插值查找、斐波那契查找、樹表查找、分塊查找、哈希查找。以前的學過的查找方式,這裏就再也不多說了。
須要注意的是,插值查找和斐波那契查找都是二分查找的優化,因此他們所查找的序列應該也是有序的。數據結構
我重點解釋一下分塊查找。
在以前的學習中,咱們學習過度塊排序。那麼類比推理一下,分塊查找的原理應該也是相似的。分塊查找的最大特色就應該是塊內無序,塊間有序。 經過這個特色,咱們能夠首先能夠肯定目標元素在哪一個塊裏面,而後經過順序查找肯定其位置。
能夠說,是一種折半查找和順序查找的優化改進的方法。函數
那麼這裏,我直接用了以前的分塊方法。
private static <T extends Comparable<? super T>> int partition(T[] data, int min, int max) { T partitionelement; int left, right; int middle = (min + max) / 2; //使用中間數據值做爲分區元素 partitionelement = data[middle]; // 暫時把它移開 swap(data, middle, min); left = min; right = max; while (left < right) { // 搜索一個元素,它是>分區元素 while (left < right && data[left].compareTo(partitionelement) <= 0) left++; // 搜索一個元素,它是<分區元素 while (data[right].compareTo(partitionelement) > 0) right--; // 交換元素 if (left < right) swap(data, left, right); } // 將分區元素移動到適當的位置 swap(data, min, right); return right; }
而後,在分塊查找裏劃分爲幾個部分。
int partition = partition(data,min,max); int leftPartition = partition(data,min,partition-1); int rightPartition = partition(data,partition+1,max);
判斷具體位置後,進行線性查找。
實驗三測試結果截圖:
這裏的排序算法是希爾排序,堆排序,二叉樹排序。
這裏仍是重點介紹一下希爾排序。由於有關第八週的測試,希爾排序學長提出了一點問題。
這裏我先放出我當時的答案。
學長說這裏應該是4插入到13的前面。
咱們這裏就應該注意希爾排序的基本思想:
希爾排序是把記錄按下標的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個文件恰被分紅一組,算法便終止。
希爾排序也是插入排序,對簡單插入排序的改進方法。
因此,對於這道題來講,最後4應該直接插入到13的前面。
實驗四測試結果截圖:
異常:
基於安卓實現查找和排序功能。是以前實驗的一個整合。
實驗五測試結果截圖:
int * temp;//將數組a擴展到F[k]-1的長度 temp=new int [F[k]-1]; memcpy(temp,a,n*sizeof(int));
int * temp
是聲明一個int
類型的數組。
memcpy()
方法應該是有關複製的操做,在java中應該如何實現。
memcpy()
函數
// 經過for循環 int[] array2 = new int[5]; for(int i = 0;i < array1.length;i++) { array2[i] = array1[i]; } for(int i = 0;i < array2.length;i++) { System.out.print(array2[i]); } System.out.println();
native
,是原生態方法,效率天然更高。public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// 經過Arrays.copyOf() int[] array4 = new int[5]; array4 = Arrays.copyOf(array1, 5); for (int i = 0; i < array4.length; i++) { System.out.print(array4[i]); }
// 經過Object.clone() int[] array5 = new int[5]; array5 = array4.clone(); for (int i = 0; i < array5.length; i++) { System.out.print(array5[i]); }