二分查找的基本思想:
m=(i+j)/2
i=m+1
j=m-1
对于一组数据:
数值 | 22 | 34 | 55 | 77 | 89 | 93 | 99 | 102 | 120 | 140 |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
查找数据77,99,34的流程:
对于77:
i=0, j=9, m=4, k=89>77 选择左子表
i=0, j=3, m=1, k=34<77 选择右子表
i=2, j=3, m=2, k=55<77 选择右子表
i=3, j=3, m=3, k=77==77 查询完毕
对于99:
i=0, j=9, m=4, k=89<99 选择右子表
i=5, j=9, m=7, k=102>99 选择左子表
i=5, j=6, m=5, k=93<99 选择右子表
i=6, j=6, m=6, k=99==99 查询完毕
对于34
i=0, j=9, m=4, k=89>34 选择左子表
i=0, j=3, m=1, k=34==34 查询完毕
程序实现:
package code.BinarySearch;
public class Solution {
public int BinarySearch(int[] data,int find){
int index=-1;
int i=0;
int j=data.length-1;
int m=(i+j)/2;
while(i!=j){
if(data[m]<find){
i=m+1;
m=(i+j)/2;
}else if(data[m]>find){
j=m-1;
m=(i+j)/2;
}else{
index=m;
break;
}
}
return index;
}
public static void main(String args[]){
int[] test={1,5,8,12,18,35,76,79,99,100,333};
int index;
Solution s=new Solution();
index=s.BinarySearch(test,100);
if(index>=0){
System.out.println("查找对象的索引为:"+index);
}else{
System.out.println("源数据中无法查到目标数据");
}
}
}