二分查找
二分查找是对有序的数组进行高效查找的算法。一般是数组,因为支持随机访问,如果是用链表,那么就使用跳表结构,即在链表中加多级索引达到二分查找的结构
下面分别用循环和递归实现简单的二分查找,也就是没有重复数据的二分查找。虽然简单,但是还有有几个小坑的。
递归算法
private static int binarySearch(int[] a, int start, int end, int val) {
//int index = (start + end)/2;//直接用取中间值的方法,可能会造成越界,因此,要使用下面的方法。
//递归终止条件,两边到头都找不到
if(end < start) //to avoid stack over flow
return -1;
//1. 用位运算符取代/2,计算效率更高
//2. +-的优先级高于<< >> 所以要加()
int index = start + (end - start>>2);//need to add () +- is priority to << >>
if(a[index] == val) {
return index;
}else if(a[index] > val) {
return binarySearch(a, start, index-1, val);
}else {
return binarySearch(a, index+1, end, val);
}
}
循环算法
private static int binarySearchLoop(int[] a ,int val) {
// to find the index where value is val
int mid = 0;
int low = 0;
int high = a.length-1;
//这里是循环执行条件,递归那边是终止条件,所以是一致的
while(low <= high) {
mid = low + ((high - low) >> 2);
if(a[mid] == val) {
return mid;
}
else if(a[mid] < val) {
low = mid+1;
}
else {
high = mid-1;
}
}
return -1;// no val in the array.
}