利用二分法查詢一個數字在陣列中的位置
阿新 • • 發佈:2019-02-13
問題:有一個升序排列無重複數字的資料,以及一個數字,利用二分法查詢數字在陣列中的位置,找到則返回其位置號,沒找到返回-1.
解答:
通過兩種方式實現:第一種方式為遞迴實現,需要傳遞陣列的頭和尾的位置。
第二種實現方式為非遞迴實現,則利用迴圈:public class MidFind { /** * * @param arr * @param key * @param startNum 陣列位置號,為陣列下標+1 * @param endNum 陣列位置號,為陣列下標+1 * @return */ public static int getLocation(int[] arr,int key,int startNum,int endNum) { if (arr==null) return -1; int middleNum=(startNum+endNum)/2; System.out.println("中間值:"+middleNum); if (startNum<endNum) { if (key==arr[middleNum]) { return middleNum+1; } else if (key<arr[middleNum]) { return getLocation(arr,key,startNum,middleNum); } else { return getLocation(arr,key,middleNum,endNum); } } else if (startNum==endNum) { return startNum; } else { return -1; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] arr={1,3,4,5,6,7,11,46,255,743,888}; int temp=getLocation(arr,11,1,11); System.out.println(temp); } }
public class MidFind2 { public static int getLocation(int[] arr,int key) { if (arr==null) return -1; int middleNum=arr.length/2; if (key==arr[middleNum]) { return middleNum+1; } int startNum=0; //陣列下標 int endNum=arr.length-1; //陣列下標 while (startNum<=endNum) { middleNum=(startNum+endNum)/2; if (key<arr[middleNum]) { endNum=middleNum; } else if (key>arr[middleNum]) { startNum=middleNum; } else { return middleNum+1; } } return -1; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] arr={1,3,4,5,6,7,11,46,255,743,888}; int temp=getLocation(arr,5); System.out.println(temp); } }