算法原理
二分检索算法又称为折半检索算法,属于非常基础简单的算法,其检索基于比较,通过比较来检索目标。
有序表中元素是按升序排列,将表中间位置记录的关键字与检索关键字比较,如果两者相等,则检索成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于检索关键字,则进一步检索前一子表,否则进一步检索后一子表。重复以上过程,直到找到满足条件的记录,使检索成功,或直到子表不存在为止,此时检索不成功。
算法优劣
优点
比较次数少,检索速度快,平均性能好
任何一种以比较为基础的算法,其最坏情况下的计算时间都不可能低于O(logn),也就是不可能存在其最坏情况下计算时间比二分检索算法的计算时间量级还低的算法
缺点
要求待查表为有序表,且插入删除困难。
代码实现
代码环境
/*
编译器:DEV-C++
二分检索算法
空间复杂度:n+5(n个数组元素,5个变量)
时间复杂度:O(logn)
采用迭代得思想
输出大小: 1.83369064331055 MiB
编译时间: 0.59s
*/
代码块
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void Random(int a[],int n) //生成随机数组并排序
{
int i,j,BOUND = n;
srand(int(time(0)));
for(i=0;i<n;i++)
{
a[i] = (rand()%100);
}
//冒泡排序
int k;
while(BOUND != 0)
{
i = 0;
for(j = 0;j < BOUND-1;j++)
{
if(a[j]>a[j+1])
{
k = a[j];
a[j] = a[j+1];
a[j+1] = k;
i = j+1;
}
}
BOUND = i;
}
return ;
}
void Print(int a[],int n) //打印数组
{
int i;
for(i = 0;i < n; i ++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}
int Binsrch(int a[],int n,int key)
{
int low,high,mid;
low = 0;
high = n-1;
while(high>=low)
{
mid = (high+low)/2;
if (key < a[mid])
{
high = mid-1;
continue;
}
else if(key > a[mid])
{
low = mid+1;
continue;
}
else if(key == a[mid])
{
return mid;
}
else
{
return -1;
}
}
return -1;
}
int main(int argc,char **argv)
{
int n,key,j;
cin>>n;
int *p = new int[n];
Random(p,n);
Print(p,n);
cin>>key;
j = Binsrch(p,n,key);
cout<<j<<endl;
}
实现方法
以上是以迭代的方法实现的二分检索,还可以使用递归对二分检索进行实现,但是递归对于空间的占用会很大