二分查找是在一組排好序的數組里查找某個指定的元素。
例如查找元素7,則如下。
利用Scanner獲取一個元素,在數組中查找,先找到數組的中間位置 middle =(left + right)/ 2; 如果所找的元素小於中間位置的元素,則在該中間位置的左邊尋找,並且將middle-1(中間位置已經比過了)值賦給right,在求出左邊元素的中間下標,直到找到該元素,右側的原理相同。
優化middle:為了防止元素過多造成的left+right數據溢出,因此 middle = (right - lef + 1) / 2 + left; 為了提高效率還可以采用位移運算: middle = ((right - left + 1) >> 1) + left。
實現如下:
import java.util.Scanner; public class BinarySearch { public static void main(String[] args) { int arr[] = {1,5,7,10,15,20,28,56,79,85}; Scanner sc = new Scanner(System.in); int val = sc.nextInt(); int index = search(arr,val); System.out.println(index); } /** * * @param arr * @param val 要查找的數 * @return 元素下標 */ private static int search(int[] arr, int val) { int right = arr.length - 1; int left = 0; while(left <= right) { int middle = (right + left) / 2; if (val == arr[middle]) { return middle;//找到則返回下標 } else if (val < arr[middle]) { right = middle - 1;//要找得數比中間數小則在左邊找 } else { left = middle + 1;//要找得數比中間數小則在右邊找 } } return -1; } }
附上二分查找的遞歸方法(自己調用自己):
public class BinarySearchDemo { public static void main(String[] args) { int arr[] = {1,5,7,10,15,20,28,56,79,85}; int index = binarySearch(arr,0,arr.length - 1,10); System.out.println(index); } /** * * @param arr * @param l 左下標 * @param r 右下標 * @param data 數據 * @return */ private static int binarySearch(int[] arr, int l, int r, int data) { int mid = (l + r) / 2; if(r < l){ return -1; } if(arr[mid] == data){ return mid; } if(arr[mid] < data){ return binarySearch(arr,mid+1,r,data); }else{ return binarySearch(arr,l,mid-1,data); } } }