折半查找c++的两种方法实现

折半查找在数据结构算法中是一个比较实用的算法。

但是它是一个只能用于查找有顺序的数,这并不影响它的使用,可以先实现一个排序再进行查找。

折半查找比较简单,但是注意的点也比较多。

下面我将用递归和非递归两种方法进行实现。


非递归:

在取头尾时有两种选择:左闭右闭[begin,end],左闭右开[begin,end)

这两个不同的选择会影响后面的条件判断

时间复杂度O(log2N)

int BinarySearch(int len,int* arr,int x)
{
    assert(arr);
	int begin = arr[0];
	int end = len;
	while (begin < end)
	{
		int mid = ((end - begin) >> 2) + begin;
		if (arr[mid] < x)
		{
			begin = mid + 1;
		}
		else if (arr[mid]>x)
		{
			end = mid - 1;
		}
		else
		{
			return mid;
		}
		return -1;
	}
}


int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int len = sizeof(arr) / (sizeof(arr[0]));
	cout << BinarySearch(10, arr, 1) << endl;
	cout << BinarySearch(10, arr, 2) << endl;
	cout << BinarySearch(10, arr, 3) << endl;
	cout << BinarySearch(10, arr, 4) << endl;
	cout << BinarySearch(10, arr, 5) << endl;
	cout << BinarySearch(10, arr, 6) << endl;
	cout << BinarySearch(10, arr, 7) << endl;
	cout << BinarySearch(10, arr, 8) << endl;
	cout << BinarySearch(10, arr, 9) << endl;
	cout << BinarySearch(10, arr, 10) << endl;
	cout << BinarySearch(10, arr, 11) << endl;
}

上面这个代码就是左闭右闭的情况,它在while里begin < end,在if里将mid + 1赋值给begin,mid-1赋值给end

下面这个代码是左闭右开的情况,它在while里begin <= end,在if里将mid直接赋值给begin和end

int BinarySearch(int len, int* arr, int x)
{
	assert(arr);
	int begin = arr[0];
	int end = len + 1;
	while (begin <= end)
	{
		int mid = ((end - begin) >> 2) + begin;
		if (arr[mid] < x)
		{
			begin = mid;
		}
		else if (arr[mid]>x)
		{
			end = mid;
		}
		else
		{
			return mid;
		}
		return -1;
	}
}

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int len = sizeof(arr) / (sizeof(arr[0]));
	cout << BinarySearch(10, arr, 1) << endl;
	cout << BinarySearch(10, arr, 2) << endl;
	cout << BinarySearch(10, arr, 3) << endl;
	cout << BinarySearch(10, arr, 4) << endl;
	cout << BinarySearch(10, arr, 5) << endl;
	cout << BinarySearch(10, arr, 6) << endl;
	cout << BinarySearch(10, arr, 7) << endl;
	cout << BinarySearch(10, arr, 8) << endl;
	cout << BinarySearch(10, arr, 9) << endl;
	cout << BinarySearch(10, arr, 10) << endl;
	cout << BinarySearch(10, arr, 11) << endl;
}

递归:

同样非递归也分两种:左闭右闭和左闭右开,在这里我急就只介绍一种,选择了我喜欢的,在你们写的话只要分清楚两种就好
int BinarrySearch(int* arr, int x, int begin, int end,int len)
{
	assert(arr);
	begin = arr[0];
	end = len + 1;
	while (begin < end)
	{
		if (begin > end)
		{
			return -1;
		}
		int mid = begin + (end - begin) >> 1;
		if (arr[mid] < x)
		{
			return BinarrySearch(arr, x, mid + 1, end);
		}
		else if (arr[mid] > x)
		{
			return BinarrySearch(arr, x, begin, mid - 1);
		}
		else
		{
			return mid;
		}
	}
}

我就是看着代码简单,根本没有当做一回事,以至于犯了错误,

希望能对你们有用,千万不要小看任何一个简单的代码


你可能感兴趣的:(数据结构)