使用此算法,必须有一个前提,那就是数组必须是有序的。
package com.ly.tcwireless.international.test; import org.junit.Test; public class ErFerFaTest extends BaseTest{ @Test public void myTest(){ int[] arr = {10, 12, 15, 17, 19, 20, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 46}; int target = 32; int index = halfSearch(arr, target); System.out.println(index); } /** * 二分法 * @param arr * @param target * @return */ private int halfSearch(int[] arr, int target){ int min = 0;//数组最小索引 int max = arr.length - 1;//数组最大索引 int mid = (min + max) / 2;//数组中间索引 int i = 0; while(true){ System.out.println("第" + ++i + "次,min:" + min + ";mid:" + mid + ";max:" + max); //跟中间值进行比较 if (target > arr[mid]) { min = mid + 1; } else if (target < arr[mid]) { max = mid - 1; } else if(target == arr[mid]){ return mid; } //重新取中间索引 mid = (min + max) / 2; //如果最小索引大于最大索引说明有问题,直接返回 if (min > max) { return -1; } } } }