在一个数组中,查找某个数值的位置可以采用线性查找法和二分查找法
今天重点来看一下二分查找法
普通的二分查找法是这样的:
public static int binarySearch(int[] list,int key) {
int low = 0;
int high = list.length - 1;
while(high >= low) {
int mid = (low + high) / 2;
if(key < list[mid])
high = mid - 1;
else if(key == list[mid])
return mid;
else
low = mid + 1;
}
return -low -1;
}
那么如果数组中的数值有重复的情况下,例如int[] array = {1, 3, 3, 3, 3, 6, 6, 8, 8, 8, 10};应该怎么办呢
问题一:当用户查询某个给定的数字时,给出该数字首次出现的位置,如查询的数值为3,则输出1;若查询的数字为8,则输出结果为7;若未能匹配查询,则程序结束时仍应显示元素应该插入的位置,如查询的数值为2,则输出1。
public static int first_location(int[] array,int number) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while(high > low) {
mid = (high + low)/2;
if(number > array[mid])
low = mid + 1;
else
high = mid;
}
if(array[low] != number)
return -1;
else
return low;
}
问题二:当用户查询某个给定的数字时,给出该数字末次出现的位置,如查询的数值为3,则输出4;若查询的数字为8,则输出结果为9;若未能匹配查询,则程序结束时仍应显示元素应该插入的位置,如查询的数值为2,则输出1。
public static int last_location(int[] array,int key) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while(low < high){
mid = (low + high + 1)/2;
if(array[mid] <= key)
low = mid;
else
high = mid - 1;
}
if(array[low] != key) {
System.out.println("未在数组中找到该值,该值应该插入数组的以下位置:");
return high + 1;
}
else
return high;
}
博主刚开始学习Java,水平有限,如果有更好的办法还希望大家多多交流呀。