1.基础二分查找
public static int binarySearch(int[] arr, int key) {
int i= 0,j=arr.length-1;
while(i<=j){
int mid = (i+j)/2;
if(key < arr[mid]){
j = mid-1;
}else if(arr[mid] < key){
i = mid +1;
}else {
return mid;
}
}
return -1;
}
2 改进二分查找
public static int binarySearch1(int[] arr, int key) {
int i= 0,j=arr.length;
while(i<j){
int mid = (i+j)/2;
if(key < arr[mid]){
j = mid;
}else if(arr[mid] < key){
i = mid +1;
}else {
return mid;
}
}
return -1;
}
3 平衡版二分查找法
public static int binarySearch2(int[] arr, int key) {
int i= 0,j=arr.length;
while(i+1<j){
int mid = (i+j) >>>1;
if(key < arr[mid]){
j = mid;
}else {
i = mid+1;
}
}
return (arr[i] == key) ? i:-1;
}
4 查找目标值最左索引
public static int binarySearchLift(int[] arr,int target){
int i=0,j=arr.length-1;
int candidate = -1;
while(i<=j){
int m = (i+j) >>> 1;
if(target < arr[m]){
j=m-1;
}else if(arr[m] < target){
i = m+1;
} else{
candidate = m;
j = m-1;
}
}
return candidate;
}
5 查找目标值最右索引
public static int binarySearchRight(int[] arr,int target){
int i=0,j=arr.length-1;
int candidate = -1;
while(i<=j){
int m = (i+j) >>> 1;
if(target < arr[m]){
j=m-1;
}else if(arr[m] < target){
i = m+1;
} else{
candidate = m;
i = m+1;
}
}
return candidate;
}
6 查找大于等于目标值的最左索引
public static int binarySearchLiftMost(int[] arr,int target){
int i=0,j=arr.length-1;
while(i<=j){
int m = (i+j) >>> 1;
if(target < arr[m]){
j=m-1;
} else {
i = m+1;
}
}
return i;
}
7 查找小于等于目标的最右索引值
public static int binarySearchRightMost(int[] arr,int target){
int i=0,j=arr.length-1;
while(i<=j){
int m = (i+j) >>> 1;
if(target < arr[m]){
j=m-1;
} else {
i = m;
}
}
return i-1;
}