Java版 二分查找

2014-11-24 03:32:11 · 作者: · 浏览: 0



一、算法介绍

折半查找(搜索)、二分查找(搜索) 已经排序的数据(假如是从左向右依次递增),取出中间数与查找值比较 如果中间值大于查找值,应该再次向左侧查找,因为左侧都小于当前中间值 如果中间值小于查找值,应该再次向右侧查找,因为右侧都大于当前中间值 不断重复上述查找过程,如果查找出结果直接返回,反之则返回未查询到。 中间数有两种计算方式: 第一次种: 初 始 值: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