二分查找是一种非常快速的查找方法,又称折半查找。
二分查找定义
二分查找(Binary Search)技术。它的前提是线性表中的记录必须是关键码有序(通常为升序),线性表必须采用顺序存储。
二分查找的基本思想:
在有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。
不断重复,直至查找成功,或所有查找区域无记录查找失败为止。
代码示例
//by lmy
#include <iostream>
using namespace std;
/*a是数组名,n为数组长度,key为要查找的数值*/
int Binary_Search(int *a, int n, int key)
{
/*low为数组下限,high为数组上限,mid为中值*/
int low, high, mid;
low = 1; /*定义最低下标为记录首位*/
high = n; /*定义最高下标为记录末位*/
while (high >= low)
{
mid = (low + high) / 2; /*折半*/
if (key < a[mid]) /*若查找值比中值小*/
high = mid - 1;
else if (key > a[mid]) /*若查找值比中值大*/
low = mid + 1;
else
return mid; /*若相等则说明mid即为查找到的位置*/
}
return 0;
}
int main()
{
int a[50], i;
for (i = 1; i <= 50; i++)
a[i] = i + 50;
cout << Binary_Search(a, 50, 52) << "\n";
}
运行结果:2
使用二分的注意点
二分查找是一种算法,其输入是一个有序的元素列表(必须有序),二分查找的是要查元素在数组中的位置
二分查找的时间复杂度:
O(logn)
学习二分的收获
1.算法的速度并非指运行时间,而是操作数的增速
2.谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
3.一些常见的大O运行时间
O(logn),也叫对数时间,这样的算法包括二分查找
O(n),也叫线性时间,这样的算法包括简单查找哦
O(n*logn),例:快速排序
O(n^2),例:选择排序(一种效率较低的排序方法)
O(n!)