前言:
二分查找法有两个先决条件:
- 采用顺序存储结构
- 按关键字有序排列
这里分两种要求:
要求1:
- 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。
实现:
import java.util.*;
public class BinarySearch {
public int getPos(int[] A, int n, int val) {
// write code here
if (n <= 0) {//如果数组长度为0
return -1;
}
if (n == 1) {//如果数组长度为1
if (A[0] == val) {
return 0;
}else {
return -1;
}
}
int left = 0;//左侧索引
int right = n-1;//右侧索引
int mid = 0;
while (left <= right) {//注意这里是小于等于
mid = left + (right-left)/2;//取中间的值
if (val == A[mid]) {//如果相等,则返回索引位置
return mid;
}else if (val > A[mid]){ //如果大于,则选择右边半部分继续比较
left = mid+1;
}else{//如果小于,则选择左边半部分继续比较
right = mid-1;
}
}
return -1;
}
}
要求2:
- 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
实现:
import java.util.*;
public class BinarySearch {
public int getPos(int[] A, int n, int val) {
if (n <= 0) {//如果数组长度为0
return -1;
}
int left = 0;//左侧索引
int right = n-1;//右侧索引
int mid = 0;
while (left < right) {//注意这是小于
mid = left + (right-left)/2;
if (val == A[mid]) {//如果等于中间值,则将mid的索引值赋给right,继续比较以来寻找到val第一次出现的位置
right = mid;//这是重点
}else if (val > A[mid]){//如果大于,则选择右边半部分继续比较
left = mid+1;
}else{//如果小于,则选择左边半部分继续比较
right = mid-1;
}
}
if (A[left] == val) {//如果最后left所在的值等于val,则说明val第一次出现的索引位置为left
return left;
}
return -1;
}
}