二分查找又称折半查找。
使用二分查找的前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。
二分查找的思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;
若给定的值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间
记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所
有查找区域无记录,查找失败为止。
直接说思想可能有点抽象,就举个简单的例子来说明吧。比如给定一个有序数组 a[10],其值从 a[0] 到 a[9] 分别
为 0 到 9 ,比如我们要在其中查找 1,那么根据二分查找思想,先取中间值,即下标为 (0+9)/2=4的值,a[4] = 4,
显然 1 < 4,所有我们要从 4 的左半区继续查找,即从 a[0] 到 a[3] 这段区域查找,这段区域的中间值下标为 1,而
a[1] = 1,所以这样我们便找到了我们要找的值,这样返回相应的下标即可。对于给定值大于中间记录的关键字的和
上面的过程是一样的,这就不多讲了。
参数说明:a为要查找的区域,n为区域的总长度,key为要查找的值
返回值:若查找成功,则返回值所在区域里的下标,若查找失败,则返回-1。(下标从0开始)
使用二分查找的前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。
二分查找的思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;
若给定的值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间
记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所
有查找区域无记录,查找失败为止。
直接说思想可能有点抽象,就举个简单的例子来说明吧。比如给定一个有序数组 a[10],其值从 a[0] 到 a[9] 分别
为 0 到 9 ,比如我们要在其中查找 1,那么根据二分查找思想,先取中间值,即下标为 (0+9)/2=4的值,a[4] = 4,
显然 1 < 4,所有我们要从 4 的左半区继续查找,即从 a[0] 到 a[3] 这段区域查找,这段区域的中间值下标为 1,而
a[1] = 1,所以这样我们便找到了我们要找的值,这样返回相应的下标即可。对于给定值大于中间记录的关键字的和
上面的过程是一样的,这就不多讲了。
二分查找的代码如下:
int Binary_Search(int *a,int n,int key)
{
int low = 0;
int high = n - 1;
int middle;
while (low <= high)
{
middle = (low + high) / 2;
if (key < a[middle])
high = middle - 1;
else if (key > a[middle])
low = middle + 1;
else
return middle;
}
return -1;
}
参数说明:a为要查找的区域,n为区域的总长度,key为要查找的值
返回值:若查找成功,则返回值所在区域里的下标,若查找失败,则返回-1。(下标从0开始)