package searching;
public class BinSearch_first_last {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={3,5,10,10,10,13,13,19,23};
System.out.println(first(a,10));
System.out.println(last(a,10));
}
private static int last(int[] a, int key) {
int min=0,max=a.length-1;
int mid=0;
while(min<=max){
mid=(max+min+1)/2;
if (key>=a[mid]) {
min=mid;
}else {
max=mid-1;
}
if (max==min) {
break;
}
}
if (a[max]!=key) {//当查找元素不存在时,返回-1
return -1;
}else {
return max;
}
}
private static int first(int[] a, int key) {
// TODO Auto-generated method stub
int min=0,max=a.length-1;
int mid=0;
while(min<=max){
mid=(max+min)/2;
if (key>a[mid]) {
min=mid+1;
}else {
max=mid;
}
if (max==min) {
break;
}
}
if (a[min]!=key) {//当查找元素不存在时,返回-1
return -1;
}else {
return min;
}
}
}
最先出现和最后出现合并【小伙伴的代码,觉得很简洁,值得学习】
package searching;
public class BinarySearchFL {
public static void main(String[] args) {
int[] a={10,10,10,10,10,13,13,19,23};
System.out.println(binarySearch(a, 13, 0));
}
/**
* @param a 待查数组
* @param key 待查关键字
* @param flag 如果flag等于0,表示查找关键字出现的第一个位置;如果flag等于1,返回关键字出现的最后一个位置
* @return 关键字的位置
*/
private static int binarySearch(int[] a, int key, int flag) {
int len = a.length;
if(key < a[0] || key > a[len - 1])
return -1;
int i = 0, j = len - 1;
while(i <= j) {
int mid = (i + j) / 2;
if(key == a[mid]) {
//接下来的三行代码是为了查找关键字出现的最早的位置
int tmp = mid;
while(--tmp >= 0 && a[tmp] == key);//防止越界
i = tmp + 1; //应该新定义一个变量表示,用i存储也行。
//接下来的两行代码是为了查找关键字出现的最后的位置
while(++mid < len && a[mid] == key);
j = mid - 1;
//返回找到的关键字
if(flag == 0)
return i;
else
return j;
}else if(key > a[mid]){
i = mid + 1;
}else {
j = mid - 1;
}
}
return -1;
}
}