首先展示一个基本的二分查找的代码
public class main{
public int binarySearch(int[] nums,int low,int high,int key){
while (low <= high){
int mid = (low + high)/2;
if (nums[mid] == key){
return mid;
} else if (nums[mid] > key) {
high = mid-1;
} else {
low = mid+1;
}
}
return -1;
}
}
接下来我们想想有什么可以优化的地方。
1.在计算机中,除法是非常耗时间的,这是因为除法操作涉及到更复杂的运算和更多的步骤。
首先,除法操作需要进行被除数和除数的比较,以确定商的符号。如果被除数和除数的符号相同,则商为正数;如果被除数和除数的符号不同,则商为负数。
其次,除法操作需要进行被除数和除数的位数扩展,以确保被除数和除数具有相同的位数。这是因为计算机通常使用二进制数进行运算,而二进制数的位数可能不同。
最后,除法操作需要进行一系列的算术运算和移位操作,以计算商和余数。这些操作需要消耗更多的时间和资源。
因此,我们可以采用移位的方法来改善一下
将
int mid = (high+low)/2;
改为
int mid = (high+low)>>1;
2.如果high和low很大的话,high和low相加可能会溢出,所以我们进一步改进一下
int mid = low+((high-low)>>1)
我们再来看看采用递归的方式
public class main{
public int binarySearch(int[] nums,int low,int high,int key){
if (low <= high){
int mid = low + ((high-low) >> 1);
if (nums[mid] == key) {
return mid;
} else if (nums[mid] > key) {
return binarySearch(nums,low,mid-1,key);
} else {
return binarySearch(nums,mid+1,high,key);
}
}
return -1;
}
}
假设元素存在重复,遇到重复要找左侧第一个,我们可以怎么做呢
public class main{
public static int search(int[] nums,int key){
if (nums == null || nums.length == 0)
return -1;
int left =0,right = nums.length-1;
while (left <= right){
int mid = left + ((right-left) >> 1);
if (nums[mid] == key){
while (mid != 0 && nums[mid] == key){
mid--;
if (mid == 0 && nums[mid] == key){
return mid;
}
return mid+1;
}
} else if (nums[mid] > key) {
right = mid-1;
} else{
left = mid+1;
}
}
return -1;
}
}