二分查找法详解

二分查找也称折半查找(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);
}

 

posted @ 2018-07-03 23:09  浮生惘语  阅读(1286)  评论(0编辑  收藏  举报