随便找一个
public static int binarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<=right) {
int m=left+(right-left)/2;
if(arr[m]==key)
return m;
else if(arr[m]>key)
right=m-1;
else
left=m+1;
}
return -1;
}
找左边界
public static int leftBinarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<right) {
int m=left+(right-left)/2;
if(arr[m]>=key)
right=m;
else
left=m+1;
}
return left;
}
找右边界
public static int rightBinarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<right) {
int m=left+(right-left)/2;
if(arr[m]<=key)
left=m;
else
right=m-1;
}
return right;
}
测试
public class 三种2分法 {
public static void main(String[] args) {
int[] arr= {1,3,4,6,6,6,6,7,8,9};
System.out.println(binarySearch(arr,6));
System.out.println(leftBinarySearch(arr,6));
System.out.println(rightBinarySearch(arr,6));
}
public static int binarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<=right) {
int m=left+(right-left)/2;
if(arr[m]==key)
return m;
else if(arr[m]>key)
right=m-1;
else
left=m+1;
}
return left;
}
public static int leftBinarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<right) {
int m=left+(right-left)/2;
if(arr[m]>=key)
right=m;
else
left=m+1;
}
return left;
}
public static int rightBinarySearch(int[] arr,int key) {
int left=0,right=arr.length-1;
while(left<right) {
int m=left+(right-left+1)/2;
if(arr[m]<=key)
left=m;
else
right=m-1;
}
return right;
}
}