算法分析:二分检索算法

算法原理

二分检索算法又称为折半检索算法,属于非常基础简单的算法,其检索基于比较,通过比较来检索目标。

有序表中元素是按升序排列,将表中间位置记录的关键字与检索关键字比较,如果两者相等,则检索成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于检索关键字,则进一步检索前一子表,否则进一步检索后一子表。重复以上过程,直到找到满足条件的记录,使检索成功,或直到子表不存在为止,此时检索不成功。

算法优劣

优点

比较次数少,检索速度快,平均性能好
任何一种以比较为基础的算法,其最坏情况下的计算时间都不可能低于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;
}

实现方法

以上是以迭代的方法实现的二分检索,还可以使用递归对二分检索进行实现,但是递归对于空间的占用会很大

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值