public class binarySearch {
//该二分法处理重复元素时返回下标小的值(有序数组)
public int bSearch(int[] array, int n, int value) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (array[mid] > value) {
high = mid - 1;
} else if (array[mid] < value) {
low = mid + 1;
} else if (mid == 0 || array[mid - 1] != value) {
return mid;
} else high = mid - 1; //这里继续用二分法处理有相同值的区间
}
return -1;
}
//该二分法查找第一个大于等于给定值的元素
public int bSearch1(int[] array, int value) {
int length = array.length;
int left = 0;
int right = length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (array[mid] >= value) {
if (mid == 0 || array[mid - 1] < value) {
return mid;
} else right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
//查找存在相同元素的有序序列中的最后一个值的索引
public int bSearch2(int[] array, int value){
int len = array.length;
int left = 0;
int right = len - 1;
while (left <= right){
int mid = left + ((right - left) >> 1);
if (array[mid] > value){
right = mid - 1;
}else if (array[mid] < value){
left = mid + 1;
}else
if (mid == array.length - 1 || array[mid + 1] != value){
return mid;
}else
left = mid + 1;
}
return -1;
}
public static void main(String[] args) {
int[] a1 = {3, 3, 4, 6, 7, 7};
binarySearch bs = new binarySearch();
int key = bs.bSearch(a1, 6, 3);
int point = bs.bSearch1(a1, 5);
int p = bs.bSearch2(a1, 7);
System.out.println("最后一个等于value的索引:" + p);
System.out.println("第一个大于给定值的索引:" + point);
System.out.println("元素的位置:" + key);
}
}
【Data structures】二分搜索处理重复元素
最新推荐文章于 2024-08-07 14:49:53 发布