課程:《程序設計與數據結構》html
班級: 1723java
姓名: 方藝雯算法
學號:20172314shell
實驗教師:王志強數組
實驗日期:2018年12月3日數據結構
必修/選修: 必修ide
實驗查找與排序-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
參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試
提交運行結果截圖
查找與排序-4
補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
測試實現的算法(正常,異常,邊界)
提交運行結果截圖
(3分,若是編寫多個排序算法,即便其中三個排序程序有瑕疵,也能夠酌情得滿分)
查找與排序-5
編寫Android程序對各類查找與排序算法進行測試
提交運行結果截圖
推送代碼到碼雲
複雜度分析:最壞狀況下,時間複雜度爲O(log2n),且其指望複雜度也爲O(log2n)。)
代碼
/*定義斐波那契查找法*/ public static int FibonacciSearch(int[] a, int n, int key) { int low = 0; int high = n - 1; //定義一個斐波那契數組 int max = 20; int[] F = new int[max]; F[0] = 1; F[1] = 1; for (int i = 2; i < max; i++) { F[i] = F[i - 1] + F[i - 2]; } int k = 0; while (n > F[k] - 1)//計算n位於斐波那契數列的位置 k++; int[] temp;//將數組a擴展到F[k]-1的長度 temp = new int[F[k] - 1]; for (int x = 0; x < a.length; x++) { temp[x] = a[x]; } for (int i = n; i < F[k] - 1; ++i) temp[i] = a[n - 1]; while (low <= high) { int mid = low + F[k - 1] - 1; if (key < temp[mid]) { high = mid - 1; k -= 1; } else if (key > temp[mid]) { low = mid + 1; k -= 2; } else { if (mid < n) return mid; //若相等則說明mid即爲查找到的位置 else return n - 1; //若mid>=n則說明是擴展的數值,返回n-1 } } return -1; }
實現希爾排序,堆排序,二叉樹排序,而後編寫測試類測試正常,異常,邊界,希爾排序和堆排序有寫博客分析過,而二叉樹排序是之前沒有學習過的,但也較好理解。
//希爾排序 public static <T extends Comparable<T>> void shellSort(T[] data) { if (data == null || data.length <= 1) { return; } int gap = data.length / 2; while (gap >= 1) { for (int a = 0; a < data.length; a++) { for (int b = a; b < data.length - gap; b = b + gap) { if (data[b].compareTo(data[b + gap]) > 0) { T temple = data[b]; data[b] = data[b + gap]; data[b + gap] = temple; } } } gap = gap / 2; } String result = ""; for (int i = 0; i < data.length; i++) { result += data[i] + " "; } System.out.println(result); }
//堆排序 public static <T extends Comparable<T>> void heapSort(T[] data) { ArrayHeap<T> temp = new ArrayHeap<T>(); for (int i = 0; i < data.length; i++) temp.addElement(data[i]); int num = 0; while (!(temp.isEmpty())) { data[num] = temp.removeMin(); num++; } }
//二叉樹排序 public static <T extends Comparable<T>> void binarytreeSort(T[] data) { AVLTree tree = new AVLTree(); for (int i = 0; i < data.length; i++) { tree.addElement(data[i]); } tree.printTree2(); }
問題一解決:我原本覺得這兩種類型是差很少的,雖然一直不知道這兩個的具體區別而後上網查找了兩者區別,參考完全讓你明白 Integer 類和 int 基本數據類型的區別,其基本API爲:
因此我把數組定義類型統一爲Integer類型就能夠了。
此次實驗的實驗五記得是比較麻煩的一個,主要牽扯的類太多,常常出現錯誤要從不少以前的類裏排查,會比較麻煩。但在修改過程當中也學習到了新的知識。此次實驗主要是關於排序和查找。也學會了更多的算法,溫習了Junit的使用。