for (int scan = index+1; scan < data.length; scan++) if (data[scan].compareTo(data[min]) >0) min = scan; swap (data, min, index);
重構你的代碼
把Sorting.java Searching.java放入 cn.edu.besti.cs1623.(姓名首字母+四位學號) 包中
把測試代碼放test包中
從新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)html
其餘的幾個查找方法在未查找目標的時候都會輸出null,在二叉樹查找裏面我沒有加入這個輸出結果。因此額外加上了不在範圍內的162315的查找,輸出ElementNotFound異常。java
最開始徹底不知道斐波拉契算法查找是什麼,後來讀了資源博客和百度上的一些博客才知道:算法
斐波那契查找與折半查找很類似,他是根據斐波那契序列的特色對有序表進行分割的。他要求開始表中記錄的個數爲某個斐波那契數小1,即n=F(k)-1;1)相等,mid位置的元素即爲所求數組
2)> ,low=mid+1,k-=2;說明:low=mid+1說明待查找的元素在[mid+1,hign]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數爲n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1個,因此能夠遞歸的應用斐波那契查找測試
3)< ,high=mid-1,k-=1;說明:low=mid+1說明待查找的元素在[low,mid-1]範圍內,k-=1 說明範圍[low,mid-1]內的元素個數爲F(k-1)-1個,因此能夠遞歸的應用斐波那契查找。命令行
/*調用二叉查找樹的find方法*/ public int LinkedBinaryTreeSearch(Integer LinkedBinarySearchTree,Integer target) throws ElementNotFoundException { LinkedBinarySearchTree sear=new LinkedBinarySearchTree(); Integer result= (Integer) sear.find(target); return result; }
根據以上要點我設計了一個比較簡單的分塊查找算法,實現過程爲:首先規定查找表的大小在10到12之間。將其排序輸出分爲以4爲塊容量劃分。首先比較查找目標與塊間的最大最小元素來肯定元素所在的塊,在在塊內部直接查找獲得結果。算法的核心是肯定目標所在塊:設計
for (int i=0;i<4;i++){ First[i]=data[i]; } for (int i=0;i<4;i++){ Second[i]=data[i+4]; } for (int i=0;i<data.length-8;i++){ Third[i]=data[i+8]; } if (target<=First[3]){ int index=0; while (result == null && index< First.length) { if (First[index]==target) result = First[index]; index++; } } if (target>=First[3]&&target<=Second[3]){ int index=0; while (result == null && index< Second.length) { if (Second[index]==target) result = Second[index]; index++; } } if (target>=Second[3]&&target<=Third[Third.length-1]){ int index=0; while (result == null && index< Third.length) { if (Third[index]==target) result = Third[index]; index++; } }else if (target<First[0]||target>Third[Third.length-1]){ result=null; }
若是要將它升級成一個能實現大規模查找的算法的話,塊的容量要根據目標表的容量來定了。3d
補充實現課上講過的排序方法:希爾排序,堆排序,桶排序,二叉樹排序等
測試實現的算法(正常,異常,邊界)
提交運行結果截圖
推送相關代碼到碼雲上code