public class BSearch {
/**
* 查找第一个出现的目标元素下标
*/
private static int bSearch(int[] array, int n, int value) { //array:数组、n:数组大小、value:需要查找的值
int low = 0;
int high = n - 1;
while (low <= high) {
//防止超过栈溢出的写法,>>是位运算 比符号运算块 追求极致
int mid = low + ((high - low) >> 1);
if (array[mid] >= value) {
high = mid - 1;
} else {
low = mid + 1;
}
}
//low < n 是为了防止最后一个元素为目标元素时,low = (n-1)+1,array[n] 抛出indexOutOfBounceException异常
if (low < n && array[low] == value) {
return low;
}
return -1;
}
/**
* 递归方式:查找第一个出现的目标元素下标
*/
private static int bSearch(int[] array, int value, int low, int high) { //array:数组、value:需要查找的值、low:起始位、high、末位
if (low <= high) {
//防止超过栈溢出的写法,>>是位运算 比符号运算块 追求极致
int mid = low + ((high - low) >> 1);
if (array[mid] >= value) {
return bSearch(array, value, low, mid - 1);
} else {
return bSearch(array, value, mid + 1, high);
}
}
//low < n 是为了防止最后一个元素为目标元素时,low = (n-1)+1,array[n] 抛出indexOutOfBounceException异常
if (low < array.length && array[low] == value) {
return low;
}
return -1;
}
public static void main(String[] args) {
int[] array = {1, 3, 6, 11, 12, 44, 44, 44, 44, 44, 66, 77, 99};
System.out.println(bSearch(array, 44, 0, array.length - 1)); //最终输出5
System.out.println(bSearch(array, array.length, 44));//最终输出5
}
}
算法:二分法之查找第一个出现的目标元素下标
最新推荐文章于 2023-04-22 15:51:32 发布