二分查找
- 变量初始化:首先,初始化两个变量low和high,分别表示查找范围的最小索引和最大索引。最初,low为0,high为数组arr的长度减1。
- 循环查找:使用while循环进行查找过程。只要low小于或等于high,就继续循环。
- 计算中间索引:用mid变量存储中间索引,通过(low+high)/2计算得到。这样可以将查找范围分成两部分。
- 比较中间元素:如果arr[mid]等于key,说明找到了目标元素,返回true。
- 排除不包含key的区域:如果arr[mid]大于key,说明key只可能在arr的前半部分,将high更新为mid-1,缩小查找范围。如果arr[mid]小于key,表明key只可能在arr的后半部分,将low更新为mid+1,缩小查找范围。
- 查找结束:若循环结束后仍未找到key,返回false。
综上所述,该算法通过不断缩小查找范围,提高了查找效率,平均而言只需要(log2n)次比较操作,其中n为数组的长度。
/**
* 二分查找
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
boolean b = searchExist(arr, 10);
System.out.println(b);
}
public static boolean searchExist(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == key) {
return true;
}
if (arr[mid] > key) {
high = mid - 1;
}
if (arr[mid] < key) {
low = mid + 1;
}
}
return false;
}
}