二分查找法详解
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。
查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
举例说明:假设有{1,2,3,4,5,6,7,8,9},要求查找元素2在序列中的位置。
首先,找出序列中间元素为5,2比5小,则在5左边的序列中继续查找;
这次中间元素为3,2仍比3小,继续在3左边的序列中查找;
此次中间元素为2,与待查找元素相同,停止查找,返回目标元素的下标。
具体代码如下:
int BinarySearch(int a[], int n, int k)
{
int left = 0, right = n - 1, mid;
mid = left + ((right - left) / 2);
while (left <= right)
{
if (a[mid] == k)
return mid;
if (a[mid] > k)
right = mid - 1;
else
left = mid + 1;
}
if (left > right)
return -1;
}
另一种函数递归的方法:
int BinarySearch(int m, int n)
{
int left = m, right = n, mid;
mid = left + ((left + right) / 2);
if (left > right)
return -1;
if (a[mid] == k)
return mid;
if (a[mid] < k)
return BinarySearch(mid + 1, n);
if (a[mid] > k)
return BinarySearch(m, mid - 1);
}