首先介绍一下什么是二分法查找。
顾名思义二分法即多次将待查数组的长度折半,但前提条件时待查找数组中的数据需要是已经排序好了的数据。
主要思想:
对于待查找数组arr[low,high],其中high=arr.length-1,待查找元素des
(1)确定数组中间位置mid=(low+high)/2
(2)将查找值des与arr[mid]进行比较,若相等,则直接返回该位置;否则确定新的查找位置,继续二分查找。区域确定如下:如果arr[mid]>des由数组的有序性可知
arr[mid,mid+1.........,high]>des;故新的区间为arr[low,.........,mid-1];如果arr[mid]<des,同理由数组的有序性可知arr[low,.........mid-1]<des,则新的区间为arr[mid+1,......,high]。每一次查找都与中间值比较,就可以确定是否查找成功,不成功当前查找区间缩小一半
具体代码如下:
package Algorithm;
public class binarySearch
{
public static void main(String[] args)
{
int[] src=new int[]{1,3,5,7,9};
System.out.println(binarySearch1(src,7));
System.out.println(binarySearch1(src,3,0,src.length-1));
}
/**
* *二分查找算法*
* @param srcArray
* 有序数组
* @param des
* 查找元素
* @return des的数组下标,没找到返回-1
*/
public static int binarySearch1(int[] srcArray,int des)
{
int low=0;
int high=srcArray.length-1;
while (low<=high)
{
int mid=(low+high)/2;
if (des==srcArray[mid])
{
return mid;
}
else if(des<srcArray[mid])
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return -1;
}
/**
* 二分查找(递归)被查找数在数组中的位置
* @param dataset
* @param data
* @param beginIndex
* @param endIndex
* @return index 被查找数下标位置
*/
public static int binarySearch1(int[]dataset,int data,int beginIndex,int endIndex)
{
int mid=(beginIndex+endIndex)/2;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex)
{
return -1;
}
if (data<dataset[mid])
{
return binarySearch1(dataset,data,beginIndex,mid-1);
}
else if(data>dataset[mid])
{
return binarySearch1(dataset,data,mid+1,endIndex);
}
else
{
return mid;
}
}
}