二分查詢的兩種實現方式(JAVA)
阿新 • • 發佈:2019-02-13
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
條件是:1.必須採用順序儲存結構
2.必須按關鍵字大小有序排列。
下面看程式碼:
public class BinarySearch {
/**
* 非遞迴方法,利用while迴圈
* @param arr
* @param des
* @return
*/
public static int binarySearch(int[] arr,int des){
int low = 0;
int high = arr.length-1;
while(low<=high){
int middle = (low+high)/2;
if (arr[middle] == des) {
return middle;
}else if (arr[middle]<des) {
low = middle+1;
}else {
high = middle-1;
}
}
return -1;
}
/**
* 遞迴查詢
* @param arr
* @param des
* @param low
* @param high
* @return
*/
public static int binarySearch(int[] arr,int des,int low,int high){
int middle = (low+high)/2;
if (des<arr[low]||des>arr[high]||low>high) {
return -1;
}
if (arr[middle]<des) {
return binarySearch(arr, des, middle+1, high);
}else if (arr[middle]>des) {
return binarySearch(arr, des, low, middle-1);
}else{
return middle;
}
}
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7,8,11,15,17};
int des = 15;
System.out.println(binarySearch(arr, des));
System.out.println(binarySearch(arr, des, 0, 10));
}
}