/** * 二分查找算法 * @param arr 待查找数组 * @param startIndex 起始下标 * @param endIndex 结束下标 * @param value 目标值 * @return 目标值在数组中的位置,如果为-1,则没有找到 */ private static int bsearch(int[] arr, int startIndex, int endIndex, int value) { // 首先判断几种特殊情况 // 目标值不在起始下标和结束下标的值之间 if (value < arr[startIndex] || arr[endIndex] < value) { return -1; } // 起始下标和结束下标相差1 if (endIndex - startIndex == 1) { int ret = value == arr[startIndex] ? startIndex : -1; return ret == -1 ? (value == arr[endIndex] ? endIndex : ret) : ret; } // 起始下标等于结束下标 if (startIndex == endIndex) { if (value == arr[startIndex]) { return startIndex; } return -1; } int middleIndex = (startIndex + endIndex) / 2; // 判断中间值,如果不等于,向两个相反方向查找 if (value == arr[middleIndex]) { return middleIndex; } else if (arr[middleIndex] < value) { return bsearch(arr, middleIndex, endIndex, value); } else { return bsearch(arr, startIndex, middleIndex, value); } }