二分法的基本思想
二分查找又称折半查找,首先将表中元素顺序排列。将需要查找的值与数组[mid]比较,若相等,则查找成功并且返回此位置,否则确定新的查找区间,继续二分查找:
若array[mid]>target,则array[mid]-array[n]均大于target,若表中存在等于target的值,则必定位于array[0]-array[mid]之中,故新的查找区间为array[0]-array[mid]
若array[mid]<target,则要查找的target必定在array[mid]-array[n]中。
因此,从初始的查找区间array[0]-array[n]开始,每经过一次与当前查找区间的中点位置上的值的比较确定查找是否成功,不成功则当前的查找区间缩小一半,重复这一过程直到找到目标值或者当前的查找区间为空。
代码实例
//array目标数组,target待查找值
public static int BinarySearch(int[] array, int target)
{
//查找区间[low,high],初次为全部数组
int low, high, mid;
low = 0;
high = array.length - 1;
while (low <= high)
{
//中间值位置
mid = (low + high) / 2;
//中间值小于目标值,将mid的值赋给low,即将区间缩小array[mid]-array[high]
if (array[mid] < target)
{
low = mid + 1;
}
//中间值大于目标值,将mid的值赋给high,即将区间缩小array[0]-array[mid]
else if (array[mid]>target)
{
high = mid - 1;
}
//中间值等于目标值,查找成功
else{
return mid;
}
}
return -1;
}
二分查找的优点和缺点
优点:查询次数少,速度快
缺点:待查表必须是有序表,且插入和删除效率低
使用范围:适用于不经常变动且查找频繁的有序列表,
二分查找只适用顺序存储结构。但是在顺序结构里插入和删除数据都必须移动大量的节点。因此,二分查找适用于改动较少,查找较多的数据。
对于查找少,改动多的数据,可以使用链表存储,进行顺序查找。