算法:
当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的(如果数据是无序的,可以调用Arrays.sort(数组变量名)进行排序)。现在我们假定数组是有序的,至于排序的算法我们会一一讲述。
二分查找主要思想是:(设查找的数组区间为array[start, end])
(1)确定该期间的中间位置K (=(start+end)/2)
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,end]>T;
故新的区间为array[start,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,end]。
每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半。递归找,即可,时间复杂度:O(log2n)。
例:数组arr = { 2, 5, 11, 3, 22, 6, 13, 35, 4 };
进行二分查找以前要对数组排序,调用Arrays.sort()方法,确保数组是有序的,才能使用二分查找。
<span style="font-size:18px;">public class BinarySearch {
/**
* 二分查找
* 简介: 在二分搜寻法中,从数列的中间开始搜寻,如果这个数小于我们所搜寻的数,由于数列已排序,则该数左边的数一定都小于要搜寻的对象,
* 所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻的对象,则右边的数无需再搜寻,直接搜寻左边的数。
* @param arr 待查找数组
* @num 待查找数
*/
public static int binarySearch(int[] arr,int num){
int start = 0;
int end = arr.length-1;
while(start <= end){
int mid = (start + end)/2;
if(num > arr[mid]){
start = mid +1 ;
}else if(num < arr[mid]){
end = mid -1;
}else{
return mid;
}
}
return -1 ;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 2, 5, 11, 3, 22, 6, 13, 35, 4 };
//对数组进行排序 调用Arrays类的sort()方法
Arrays.sort(arr);
int find = binarySearch(arr,5);
if (find != -1) {
System.out.println("找到数值于索引:" + find);
} else {
System.out.println("找不到数值");
}
}
}</span>
显示结果:数值5的索引:3
本文参考:
http://www.cnblogs.com/sunzn/archive/2013/02/13/2910897.html