二分搜索
(本文有些代码来自Java API)
二分搜索,顾名思义就是将一组数据分成两部分来进行搜索。二分搜索算法的前提条件是这一组数据一定是已经排好序(升序)的数组。
根据二分搜索的思想,首先我们根据已排好序(升序)的数组的长度进行二分,并将得到的中间值(a[mid]与需要查找的值(key)进行比较,若key>a[mid]则将在a[mid]右侧的数继续二分进行如上比较,以此类推直至key=a[mid]返回mid;若key<a[mid]则将在a[mid]左侧的数继续二分进行如上比较,以此类推直至key=a[mid]返回mid。
算法示意图:key = 4
原始数据:1 2 3 4 5 6 7 8 9
第一次二分: 1 2 3 4 5 6 7 8 9
第二次二分:1 2 3 4 5
第三次二分:4
二分搜索算法在每次进行二分操作的时候数据量减少了原来的一半,所以查找效率比遍历查找要高
算法名称:二分搜索
输入:a[n]:一组排好序的数,key:需要查找的数
输出:key在数组中的索引
public class binarySearch{
public static void main(String[] args){
int[] a = new int[]{1,2,3,4,5,6,7,8,9};//创建一个静态数组来存储排序好的数组
int ret = BinarySearch(a,4);//电泳BinarySearch对4进行搜索,将结果赋给ret
System.out.println(ret);//输出ret即4在数组中的索引,注意:数组索引是从0开始的
}
static int BinarySearch(int[] arr , int key){//创建静态方法B
int left = 0;
int right = arr.length-1;
while(left <= right){
int mid = left + (right - left)/2;
if(arr[mid] < key){
left = mid + 1;//若arr[mid] < key则从mid右边的数开始二分搜索
}else if(arr[mid] > key){
right = mid -1;若arr[mid] >key则从mid右边的数开始二分搜索
}else{
return mid;//即arr[mid]==key
}
}
return -1;//若上述条件都不成立则返回-1
}
}
下面附上Java API中BinarySearch的实现伪代码:java.util.Arrays
private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
long midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
在Java 8 API 中有对BinarySearch在不同数据类型的实现,感兴趣的可以自己在API中查看。
public static int binarySearch(int[] a, int key) {
return binarySearch0(a, 0, a.length, key);
}
下附Java8API泛型实现代码例:
private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,
T key, Comparator<? super T> c) {
if (c == null) {
return binarySearch0(a, fromIndex, toIndex, key);
}
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
T midVal = a[mid];
int cmp = c.compare(midVal, key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}