一、查找思想
折半查找 也称为二分查找,是一种效率较高的查找方法,查找时要求表中的节点按关键字的大小排序,并且要求线性表顺序存储。
- 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[mid])相比较;
- 若比较结果相等,则查找完成;若不相等,再根据要查找的关键字值(key)与该中结点关键值(mid)的大小来确定下一步在那个子表中进行;
- 若待查关键值大于中间结点的关键字值(key > arr[mid])),则应查找中间结点以后的字表,否则(key < arr[mid])),查找中间结点以前的字表;
- 重复步骤1~3,直到找到满足条件的结点,或者明确表中没有这样的结点。
二、图解
假设用变量 low 和 high 分别存储待查元素所在范围的下界和上界,变量 mid 存储区间的中间位置,即 mid = [(low + high) / 2]。
三、代码实现
public class BinarySearch { public static void main(String[] args) { int[] arr = {6, 12, 33, 87, 90, 97, 108, 561}; System.out.println(binarySearch(arr, 90)); //递归查找 System.out.println(binarySearch(arr, 0, arr.length - 1, 90)); } /** * @param arr 待排序列 * @param key 待查找值 * @return 待查找值在待排序列中的位置 */ private static String binarySearch(int[] arr, int key) { int low = 0; int high = arr.length - 1; while (low <= high) { //必须为 '<=' 否则无法匹配到指定的key; int mid = (low + high) / 2; if (arr[mid] == key) { return "Successful matching [" + (mid + 1) + "]"; } else if (arr[mid] > key) { high = mid - 1; } else { low = mid + 1; } } return "Successful matching -1"; } /** * 递归实现二分查找 * @param arr 待排序列 * @param start 待排序列开始值 * @param end 待排序列结束值 * @param key 待查找值 * @return 待查找值在待排序列中的位置 */ private static int binarySearch(int[] arr, int start, int end, int key) { if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能为'>=' return -1; } int mid = (start + end) / 2; if (key > arr[mid]) { return binarySearch(arr, mid + 1, end, key); } else if (key < arr[mid]) { return binarySearch(arr, start, mid - 1, key); } else { return mid + 1; } } }