二分查找思路很简单,但要把程序写对,却很难,有兴趣的话,可以在网上查一下相关资料,下面给出两种常见的错误:(至于具体错误原因,可以分析程序的执行)

 

错误程序1:

#include <iostream>
using namespace std;

int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low < high)        //key可能刚好在low与high相等的地方
	{
		mid = (low + high)/2;
		if(key == a[mid])
			return mid;

		if(key < a[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}

	return -1;
}

int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 0;
	int result = binarySearch(a, n, key);

	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;

	return 0;
}


错误程序2:

#include <iostream>
using namespace std;

int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low < high)        //可能是死循环
	{
		mid = (low + high)/2;
		if(key == a[mid])
			return mid;

		if(key < a[mid])
			high = mid;
		else
			low = mid;
	}

	return -1;
}

int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 100;
	int result = binarySearch(a, n, key);

	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;

	return 0;
}


 正确程序如下:

#include <iostream>
using namespace std;

int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low <= high)
	{
		mid = (low + high)/2;  // 网友“乐行僧”和“eewcee”在评论中说这里可能溢出。确实如此,可以继续优化。具体方法“乐行僧”已经在评论中给出了。 非常感谢。学习了。
		if(key == a[mid])
			return mid;

		if(key < a[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}

	return -1;
}

int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 0;
	int result = binarySearch(a, n, key);

	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;

	return 0;
}


 

 


本文转载:CSDN博客