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