Java版 二分查找

来源:互联网 发布:mac 隐藏文件无法显示 编辑:程序博客网 时间:2024/06/09 05:23



一、算法介绍

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




0 0