二分查找:是一种在有序数组中查找某一特定元素的搜索算法。
这种搜索算法每一次比较都使搜索范围缩小一半。
写法一:
根据定义:
1 public static int binary(int[] arr, int data) 2 { 3 int min=0; 4 int max=arr.length-1; 5 int mid; 6 while(min<=max) 7 { 8 mid=(min + max)/2; 9 if(arr[mid]>data)
10 max=mid-1;
11 else if(arr[mid]<data)
12 min=mid+1;
13 else
14 return mid;
15 } 16 return -1; 17 }
写法二:
对于写法一而言,第8行代码会出现bug:mid=(min + max)/2;
这句代码在 min 和 max 很大的时候,会出现溢出的情况,从而导致数组访问出错。
进行改进:将加法变成减法。
1 public static int binary(int[] arr, int data) 2 { 3 int min=0; 4 int max=arr.length-1; 5 int mid; 6 while(min<=max) 7 { 8 mid=min+(max-min)/2;// 防止溢出 9 if(arr[mid]>data) 10 max = mid - 1; 11 else if (arr[mid] < data) 12 min = mid + 1; 13 else 14 return mid; 15 } 16 return -1; 17 }
写法三:
利用位运算(官方的二分搜索法的实现写法)
1 public static int binary(int[] arr, int data) 2 { 3 int min=0; 4 int max=arr.length-1; 5 int mid; 6 while (min <= max) 7 { 8 mid=min+( (max - min)>>1 );// 无符号位运算符的优先级较低,先括起来 9 if(arr[mid]>data) 10 max = mid - 1; 11 else if(arr[mid]<data) 12 min = mid + 1; 13 else 14 return mid; 15 } 16 return -1; 17 }