import java.util.*; 2 /** 3 * 4 * 一个二分查找法 5 * @author nileader 6 */ 7 public class BinaryQuery { 8 /** 9 *   *折半查找法,又称十分法查找 查找的对象是一个按序排好的数组    10 */ 11 public static void main(String[] args) { 12 int[] initVals = { 9,12, 37, 53, 67, 71, 89, 122, 290, 435, 555, 888, 1104, 1111, 2222,3333,21343,43256,56778300 }; 13 for(int i = 0; i < initVals.length; i++) 14 { 15 System.out.print(initVals[i] + "、"); 16 } 17 Scanner cin = new Scanner(System.in); 18 while(cin.hasNext()) 19 { 20 int targetVal = cin.nextInt(); 21 BinaryQuery bq = new BinaryQuery(); 22 int postion = bq.query(initVals,targetVal); 23 if(postion == -1) System.out.println("没有找到"); 24 else System.out.println("要查找的数字在数组中的第 " + (postion + 1) + "个位置"); 25 } 26 } 27 28 /* 29 * @param values 要找的数组对象 30 * @param targetVal 要找的目标数字 31 * @return -1 没有找到,返回-1 32 */ 33 public int query(int[] initVals, int targetVal) { 34 int lowBound = 0; 35 int upBound = initVals.length - 1; 36 37 //相当于一个指针,指向下一个要比的数字 38 int nowPostion; 39 40 while (true) { 41 42 //指向现在所有数字的中间,没有整除时向下取整,如7/2=3 43 nowPostion = (lowBound + upBound) / 2; 44 //如果现在这个数字就是了,返回现在的编号 45 if (initVals[nowPostion] == targetVal) { 46 return nowPostion; 47 } 48 //如果上界小于下界时,说明已经找完全部了,返回-1表示没有找到 49 else if (lowBound > upBound) { 50 return -1; 51 } 52 //还可以继续找 53 else { 54 //当前指针的数比targetVal要小,那么要往小的方向继续找 55 if (initVals[nowPostion] < targetVal) { 56 lowBound = nowPostion + 1; 57 } 58 //当前指针的数比targetVal要大,那么要往大的方向继续找 59 else { 60 upBound = nowPostion - 1; 61 } 62 } 63 } 64 65 } 66 } //源代码片段来自云代码http://yuncode.net