/** * 折半查找算法 Binary Search * @param a 一个有序的集合(本次为由小到大) * @param x 需要查询的值 * ps: 首先使用折半算法的时候 集合必须是有序的 * eg: a[1,3,5,7,9] x 3 * a mid low height * [1,3,5,7,9] 2 0 1 * [1,3] 0 1 1 * [3] 1 - - * 最终返回1 也就是3在集合的索引是1 * 备注:由以上分析不难得出 若集合中存在该值 则返回的是程序第一次查到该值所在的索引 * 若 该集合出现重复的数据 可能返回的不是其在集合的最小索引 * 建议:使用折半查找算法 使用的集合是有序且值不重复 结果则是最精准的 若有序但存在重复值 会存在误差 * */ public static int binarySearch(int[] a, int x) { int low = 0, height = a.length - 1; while (low <= height) { int mid = (low + height) / 2; if (a[mid] > x) { height = mid - 1; } else if (a[mid] < x) { low = mid + 1; } else { return mid; } } return -1; }