一、算法介绍
折半查找(搜索)、二分查找(搜索) 已经排序的数据(假如是从左向右依次递增),取出中间数与查找值比较 如果中间值大于查找值,应该再次向左侧查找,因为左侧都小于当前中间值 如果中间值小于查找值,应该再次向右侧查找,因为右侧都大于当前中间值 不断重复上述查找过程,如果查找出结果直接返回,反之则返回未查询到。 中间数有两种计算方式: 第一次种: 初 始 值:middle = (end - start)/2; 每次计算 :middle = (end - start) / 2 + middle;第二种: middle = (start + end)/2;
二、代码实现
/**
* 二分查找,递归与非递归形式
*/
public class BinarySearch {
public int searchValue(int [] data, int indexValue) {
int start = 0;
int middle = 0;
int end = data.length - 1;
while (start <= end) {
middle = (start + end)/2;
if (data[middle] < indexValue) {
start = middle + 1;
} else if (data[middle] > indexValue) {
end = middle - 1;
} else {
return middle;
}
}
return -1;
}
public int searchValue(int [] data, int start, int end, int indexValue) {
if (start > end) {
return -1;
}
int middle = (start + end)/2;
if (data[middle] < indexValue) {
return searchValue(data, middle+1, end, indexValue);
} else if (data[middle] > indexValue) {
return searchValue(data, start, middle-1, indexValue);
} else {
return middle;
}
}
public static void main(String[] args) {
int[] arr = {2, 3, 5, 6, 8, 9};
BinarySearch search = new BinarySearch();
System.out.println(search.searchValue(arr, 9) == 5);
System.out.println(search.searchValue(arr, 8) == 4);
System.out.println(search.searchValue(arr, 6) == 3);
System.out.println(search.searchValue(arr, 5) == 2);
System.out.println(search.searchValue(arr, 3) == 1);
System.out.println(search.searchValue(arr, 2) == 0);
System.out.println(search.searchValue(arr, 10) == -1);
System.out.println(search.searchValue(arr, 0, arr.length-1, 9) == 5);
System.out.println(search.searchValue(arr, 0, arr.length-1, 8) == 4);
System.out.println(search.searchValue(arr, 0, arr.length-1, 6) == 3);
System.out.println(search.searchValue(arr, 0, arr.length-1, 5) == 2);
System.out.println(search.searchValue(arr, 0, arr.length-1, 3) == 1);
System.out.println(search.searchValue(arr, 0, arr.length-1, 2) == 0);
System.out.println(search.searchValue(arr, 0, arr.length-1, 10) == -1);
}
}
三、逐步演示
四、时间空间复杂度
时间复杂度:O(longn)(n代表集合中元素的个数)空间复杂度:O(1)
五、参考资料:
二分查找法的实现和应用汇总 http://www.cnblogs.com/ider/archive/2012/04/01/binary_search. html《大话数据结构》
五大常用算法之一:分治算法 http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html