参考链接: https://www.cnblogs.com/kyoner/p/11080078.html.
算法思想
给于一个有序数组array(这里按从小到大类比)和目标值target。如果目标值在数组内,返回其下标,否则返回-1。 每次将选定区域分为二部分(因为已经分好序),取区域中的临界值对target进行比较,如果大于,则在右边区域,如果小于,则在左边区域,如果等于,返回临界值在数组中的序号。
算法实现
基本二分查找
public static int binarySearch_1(int sort_array[],int target) {
int left=0;
int right = sort_array.length -1 ;
while(left<right)
{
int mid = (left+right)/2;
if(sort_array[mid]==target)
{
return mid;
}else if(sort_array[mid]<target)
{
left = mid+1;
}else if(sort_array[mid]>target)
{
right = mid-1;
}
}
return -1;
}
说明:
1.适用于非边界问题
2.检索区域是[left,right-1] ->循环终止条件是 left>right
左边界二分查找
public static int binarySearch_left(int sort_array[], int target)
{
int left =0;
int right = sort_array.length;
if(right==0) return -1;
while(left<right)
{
int mid = (left+right)/2;
if(sort_array[mid]==target)
{
right = mid;
}else if(sort_array[mid]>target)
{
right = mid;
}else if(sort_array[mid]<target)
{
left = mid+1;
}
}
if(left==sort_array.length) return -1;
return sort_array[left]==target?left:-1;
}
说明:
1.left特殊含义:代表有left个值小于target;
2.边界二分查找在一定程度上增加了时间复杂度;
3.如何实现边界查找? 当找到目标值时,不结束而是继续向小区域缩小查找范围,代码实现:
if(sort_array[mid]==target) right = mid;
4.逻辑:
检索范围[left,right) -> 循环条件 left < right -> 终止条件 left == right
检索范围[left,right) -> else if(sort_array[mid]>target) right = mid
左边界二分 -> if(sort_array[mid]==target) right = mid
->
return sort_array[left]==target?left:-1;
右边界二分查找
public static int binarySearch_right(int sort_array[],int target) {
int left =0;
int right = sort_array.length;
if(right==0) return -1;
while(left<right)
{
int mid = (left+right)/2;
if(sort_array[mid]==target)
{
left = mid+1;
}else if(sort_array[mid]>target)
{
right = mid;
}else if(sort_array[mid]<target)
{
left = mid+1;
}
}
if(right==sort_array.length) return -1;
return sort_array[right-1]==target?(right-1):-1;
}
说明:
2.如何实现边界查找? 当找到目标值时,不结束而是继续向大区域缩小查找范围,代码实现:
if(sort_array[mid]==target) left = mid+1;
3.逻辑:
检索范围[left,right) -> 循环条件 left < right -> 终止条件 left == right;
检索范围[left,right) -> else if(sort_array[mid]>target) right = mid;
;
右边界二分 ->if(sort_array[mid]==target) left = mid+1
-> return sort_array[right-1]==target?(right-1):-1;
;