假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1。代码如下:
package cn.sunzn.dichotomy; public class DichotomySearch { public static void main(String[] args) { int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 }; System.out.println(search(arr, 12)); System.out.println(search(arr, 45)); System.out.println(search(arr, 67)); System.out.println(search(arr, 89)); System.out.println(search(arr, 99)); } public static int search(int[] arr, int key) { int start = 0; int end = arr.length - 1;
// 将开始和结束的下标进行比较,如果不一致则遍历下一个 while (start <= end) {
// 取到中间的下标 int middle = (start + end) / 2;
// 如果需要计算下标的 数组值比中间下标的数组值小,则在数组前一半中进行查找,即 将结束值-1 if (key < arr[middle]) { end = middle - 1;
// 如果需要计算的值比中间值大,则在数组后半段查找,即将开始值+1 } else if (key > arr[middle]) { start = middle + 1;
// 依次遍历后,根据开始和结束的值依次变化后查找到最终的需要计算下标值的数组下标 } else { return middle; } } return -1; } }