二分查詢法(遞迴和非遞迴實現)
阿新 • • 發佈:2019-01-27
二分查詢法:
二分查詢法又稱折半查詢法,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。(借鑑百度百科)時間複雜度為:log2n,即log以2為底,n的對數。
1.遞迴方式完成二分查詢法:
2.非遞迴實現二分查詢法:/** * 遞迴方法實現二分查詢法. * @param Array陣列 * @param low 陣列第一位置 * @param high 最高 * @param keyValue 要查詢的值. * @return 返回值. */ int binSearch(int Array[],int low,int high,int keyValue) { if (low<=high) { int mid = (low+high)/2; if(keyValue == Array[mid]) return mid; else if(keyValue<Array[mid]) //移動low和high return binSearch(Array,low,mid-1,keyValue); else if(keyValue>Array[mid]) return binSearch(Array,mid+1,high,keyValue); } else return -1; }
查詢到了則返回資料陣列的下標,沒查詢到則返回-1./* * 非遞迴二分查詢演算法 * 引數:整型陣列,需要比較的數. */ public static int binarySearch(Integer[]intArray,int keyValue){ //第一個位置. int low=0; //最高位置.陣列長度-1,因為下標是從0開始的. int high=intArray.length-1; //當low"指標"和high不重複的時候. while(low<=high){ //中間位置計算,low+ 最高位置減去最低位置,右移一位,相當於除2.也可以用(high+low)/2 int middle=low+((high-low)>>1); //與最中間的數字進行判斷,是否相等,相等的話就返回對應的陣列下標. if(kyValue==intArray[middle]){ return middle; //如果小於的話則移動最高層的"指標" }else if(keyValue<intArray[middle]){ high=middle-1; //移動最低的"指標" }else{ low=middle+1; } } return-1; } }