概念
清华大学出版社出版的《算法设计与分析(第二版)》中有关于折半查找的介绍:
折半查找也叫二分查找,是一种在有序数组中查找特定元素的搜索算法。 其基本思想是每次将搜索区间减半,直到找到目标值或确定不存在为止。
注意:折半查找的前提是整个序列有序。
编码
public static int binarySearch(int[] arr,int number) {
int low = 0,high = arr.length-1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (number < arr[mid]) {
high = mid - 1;
} else if (number > arr[mid]) {
low = mid + 1;
}else
return mid;
}
return -1;
}
使用递归时:
public static int halfHandle(int[] arr,int number,int low,int high) {
int i = (low + high) / 2;
if (low > high)
return -1;
if (number < arr[i]) {
return halfHandle(arr,number,low,i -1);
}else if (number > arr[i]) {
return halfHandle(arr,number,i+1,high);
}
return i;
}
测试:
public static void main(String[] args) {
int[] arr = {2,7,9,11,13,16,18};
int index1 = halfHandle(arr, 13, 0, arr.length - 1);
int index = binarySearch(arr,13);
System.out.println("不使用递归查询的结果:"+index);
System.out.println("使用递归查询的结果:"+index1);
}
今天去面试的时候刚好遇到了这个折半查找😀,写完才发现看错成了快速排序😢,特地记录一下,要晕死在厕所了😫