【折半查找】

折半查找

  • 定义:
    折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储。折半查找的基本思想是:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

  • 时间复杂度
    由于具有n个节点的完全二叉树的深度为⌊log₂n⌋+1,尽管折半查找判定二叉树并不是完全二叉树,但同样相同的推导可以得出,最坏的情况查找到关键字或者查找失败的次数为⌊log₂n⌋+1。因此我们折半算法的时间复杂度为:O(logn),它显然远远好于顺序查找的O(n)的时间复杂度了。

  • 代码演示:

#include <iostream>
#include <algorithm>
using namespace std;

int binarySearch(int arr[],int len, int m)
{
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		int k = (left + right) / 2;
		if (m == arr[k])
		{
			return k;
		}
		else if (m > arr[k])
		{
			left = k + 1;
		}
		else
		{
			right = k - 1;
		}
	}
	return -1;
}

int main()
{
	int arr[] = { 3,14,27,31,39,42,55,70,74,81,85,93,98 };
	int len = sizeof(arr) / sizeof(arr[0]);
	cout << "请输入你想要查找的值:" << endl;
	int m;
	cin >> m;
	int x = binarySearch(arr, len, m);
	if (x == -1)
	{
		cout << "不存在该值!" << endl;
	}
	else
	{
		cout << "该值在第 " << x + 1 << "个" << endl;
	}
	return 0;
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_41879343/article/details/89642907