1.概念:
折半查找,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
2.代码一:
/**
*
* @param x 被查找的数组(有序)
* @param key 查找特定的元素
* @return 找到元素返回元素在数组中的位置,没有找到就返回-1
*/
public static <T extends Comparable<T>> int binarySearchsort(T[] x, T key) {
int low = 0;//起点元素
int hight = x.length - 1;//终点元素
while (low <= hight) {
//中间元素
int mid = low + ((hight - low) >> 1);
//如果要查找的元素等于中间元素
if (key.compareTo(x[mid]) == 0) {
return mid;
//如果要查找的元素大于中间元素 ,low=mid+1
} else if (key.compareTo(x[mid]) > 0) {
low = mid + 1;
//如果要查找的元素小于中间元素 ,hight = mid-1
} else if (key.compareTo(x[mid]) < 0) {
hight = mid -1;
}
}
return -1;
}
3.代码二:
递归实现
private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {
if(low <= high) {
int mid = low + ((high - low) >> 1);
if(key.compareTo(x[mid]) == 0) {
return mid;
}
else if(key.compareTo(x[mid]) < 0) {
return binarySearch(x, low, mid - 1, key);
}
else {
return binarySearch(x, mid + 1, high, key);
}
}
return -1;
}
}
注意:计算中间位置时,不应该使用(high + low) / 2的方式,因为加法运算可能导致整数越界,这里应该使用一下三种方式之一:low + (high – low) / 2或low + (high – low) >> 1或(low + high) >>> 1(注:>>>是逻辑右移,不带符号位的右移)