二分搜索法
二分搜索法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法运算终止。
总结一下,二分搜索需要注意的点有以下几条:
- 数组一定记得要先排序!!!(不排序会出现各种莫名其妙的返回值)
- 取中位值的时候,需要注意整数加法是否会溢出的问题。
- 当查找不在数组内的元素时,需要返回-1代表没有找到。
- 如果出现待查找元素有重复的元素,需要确定返回的是哪一个元素的下标。
-
/** * description : 二分查找。 * @param array 需要查找的有序数组 * @param from 起始下标 * @param to 终止下标 * @param key 需要查找的关键字 * @return */ public static <E extends Comparable<E>> int binarySearch(E[] array, int from, int to, E key) throws Exception { if (from < 0 || to < 0) { throw new IllegalArgumentException("params from & length must larger than 0 ."); } if (from <= to) { int middle = (from >>> 1) + (to >>> 1); // 右移即除2 E temp = array[middle]; if (temp.compareTo(key) > 0) { to = middle - 1; } else if (temp.compareTo(key) < 0) { from = middle + 1; } else { return middle; } } return binarySearch(array, from, to, key); }
这是二分搜索法的代码例题。