二分法:(二分法不是只能做數組,這里的數組只是為了舉例)
在給出的有序排列的數組中,把目標值和數組中間值進行比較,如果相等,則返回中間值下標,如果目標值小於中間值,就從數組的前半段再次執行二分法查找,如果目標值大於中間值,從數組的后半段開始二分法查找
二分法查找主要是比較的次數少,查找的速度快,平均性能好,但是待查表一定要是有序的,插入刪除比較困難,所以二分法查找不適用於經常變動的有序列表.
上代碼:
1 package cn.summerchill.sort; 2 3 public class BinarySearch { 4 public static void main(String[] args) { 5 //有序排列數組(大到小,小到大無所謂) 6 int[] array = {1,2,3,4,5,6,7,8,9,10}; 7 //打印二分法的返回值 8 System.out.println(searchRecursive(array,0,array.length-1,9)); 9 } 10 public static int searchRecursive(int[] array,int start,int end,int findValue){ 11 if(array==null){ 12 return -1; 13 } 14 if(start<=end){ 15 //中間位置 16 int middle = (start + end)/2; 17 //中值 18 int middleValue = array[middle]; 19 if(findValue == middleValue){ 20 //與中值相等就直接返回 21 //return middle; 22 return middleValue; 23 }else if(findValue < middleValue){ 24 //目標值小於中值,在中值前面找(這里調用了二分法的方法) 25 return searchRecursive(array,start,middle - 1,findValue); 26 }else { 27 //目標值大於中值,在中值后面找(這里調用了二分法的方法) 28 return searchRecursive(array,middle + 1,end,findValue); 29 } 30 }else{ 31 //返回-1,查找失敗 32 return -1; 33 } 34 } 35 }
======================2017-10-22晚添加========
自己寫二分法:
1 public class BinarySearch { 2 public static void main(String[] args) { 3 Integer arr[] = { 1, 2, 4, 6, 8, 11, 23 }; 4 binarySearch(arr,0,arr.length - 1, 23); 5 } 6 public static void binarySearch(Integer[] arr,int start, int end, int num){ 7 if(arr != null && arr.length > 0){ 8 int middle = (end + start) / 2; 9 //中間的值大於目標值 10 /* 11 一開始我處理的方式是 end = middle; start = middle 12 這樣在查找最后一個元素的時候容易造成棧溢出 StackOverFlow 13 因為查找最后一個元素的時候 (index-1 + index)/2 永遠比index 小,找不到最后一個元素 14 需要對 end - start == 1 做一個單獨的判斷. 15 但是如果 end = middle -1 ; start = middle + 1 這種形式就沒有問題了. 16 */ 17 if(arr[middle] > num){ 18 end = middle - 1; 19 binarySearch(arr, start, end, num); 20 }else if(arr[middle] < num){//中間的值小於目標值 21 start = middle + 1; 22 binarySearch(arr, start, end, num); 23 }else{//和中間的值相等 24 System.out.println("找到對應的值,值為:" + num); 25 } 26 } 27 } 28 }
