二分查找又称折半查找,是一种较高效率的查找方法。
优点:比较次数少,查找速度快,平均性能好,占用系统内存较少。
缺点:要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
算法要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
算法思想:
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x小于a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x大于a[n/2],则我们只要在数组a的右 半部继续搜索x
算法实现:
方式一:while循环
public int binarySearch(Integer[] srcArray, int element) {
//定义初始最大、最小索引
int start = 0;
int end = srcArray.length - 1;
//确保不会越界重复查找
while (start <= end && start <= srcArray.length - 1 && end <= srcArray.length - 1) {
//获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,
// 这样产生溢出后再 / 2 是不会产生正确结果的,
int middle = start + (end - start) / 2;
if (element == srcArray[middle]) {
return middle;
//判断下限
} else if (element < srcArray[middle]) {
end = middle - 1;
//判断上限
} else {
start = middle + 1;
}
}
//若没有查找到则返回-1
return -1;
}
方式二:递归
public int binarySearch(Integer[] srcArray, int start, int end, int element) {
//获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,
// 这样产生溢出后再 / 2 是不会产生正确结果的,
int middle = start + (end - start) / 2;
if (element == srcArray[middle]) {
return middle;
} else if (start > end) {
return -1;
//判断下限
} else if (element < srcArray[middle]) {
end = middle - 1;
return binarySearch(srcArray, start, end, element);
//判断上限
} else {
start = middle + 1;
return binarySearch(srcArray, start, end, element);
}
}