二分查找
二分查找原理:
又称为折半查找,元素必须是顺序存储的,按照大小有序排列.
如果元素按照升序排列,取中间位置的元素与要查找的元素比较,两者相等就表示查找元素成功;否则,按照中间位置的元素为界限,将左右的元素分成两部分,如果中间位置的元素大于要查找的元素,就在左边部分取中间位置继续查找;如果中间位置的元素小于要查找的元素,就在右边部分取中间位置继续查找;重复以上操作,直到查找到要查找的元素或者不再能分成左右两部分为止(查找不成功).
示例:
例如对于数组[11,22,33,44,55,66,77,88,99]来说,数组长度为9,数组下标为0,1,2,3,4,5,6,7,8
示例一:查找77
第一次查找:
起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;
由于55<77,则在55的右侧继续查找;
第二次查找:
起始数组下标为5,终止数组下标为8,中间位置数组下标为6,元素为77;
由于77==77,查找成功;
示例二:查找17
第一次查找:
起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;
由于55>17,则在55的左侧继续查找;
第二次查找:
起始数组下标为0,终止数组下标为3,中间位置数组下标为1,元素为22;
由于22>17,则在22的左侧继续查找;
第三次查找:
起始数组下标为0,终止数组下标为0,中间位置数组下标为0,元素为11;
由于11<17,则在11的右侧继续查找;
第四次查找:
起始数组下标为1,终止数组下标为0,可知这种情况是不合常理的,可以判断为查找不到;
总结:
二分查找的退出循环条件可以总结为:查找的元素与被查找的元素相等和起始下标大于终止下标;
二分查找的循环条件可以使用起始下标小于终止下标;
Java代码实现:
package com.yg.study; public class BinarySearch { public static void main(String[] args) { int[] arr= {11,22,33,44,55,66,77,88,99}; boolean flag=doSearch(arr,77); //boolean flag=doSearch(arr,17); System.out.println(flag?"查找成功":"查找失败"); //查找结果打印 } private static boolean doSearch(int[] arr,int num) { int beginIndex=0; //起始索引取数组的最小索引 int endIndex=arr.length-1; //终止索引取数组的最大索引 int middleIndex=0; //中间位置索引设置初始值 while(beginIndex<=endIndex) { //如果起始索引大于终止索引,退出循环 middleIndex=(beginIndex+endIndex)>>>1; //计算中间位置索引 if (arr[middleIndex]==num) { //查找到指定的元素 return true; }else if (arr[middleIndex]>num) { endIndex=middleIndex-1; }else { beginIndex=middleIndex+1; } } return false; //没有查找到指定的元素 } }
结果展示: