C++ 二分查找

一. 二分查找简述

1. 什么是二分查找

          二分查找又称折半查找,就是每次取左端点和右端点的平均值,判断这个平均值是否符合要求,之后按情况改变左端点或右端点的值,直到左端点大于右端点时输出答案

          那为什么不从头到尾枚举一遍呢?如果从头到尾枚举一遍,要是刚开始就有一个元素符合要求,那还好办,万一到最后才有符合要求的可就是On级别的时间复杂度了,可如果用二分查找就只用log2(n)级别了,大大减少了时间复杂度。

 2. 二分查找的优缺点

          优点 :比较次数少,查找速度快,平均性能好

          缺点 :要求待查表为有序表,且插入删除困难

          条件 :查找的数组必须为有序序列

二. 代码段

话不多说,直接上代码( 解释在后面 ):

#include <iostream>

using namespace std;

int arr[1000010];

int main( void )
{
	int len, mid, key, i;
	
	int low = 1, high;
	
	cin >> len >> key;
	
	for( i = 1; i <= len; i++ )
	{
		cin >> arr[i];
	}	
	
	high = len;	
	
	while( low <= high )
	{
		mid = ( low + high ) / 2;
		
		if( arr[mid] == key )	 
		{	
			cout << mid; return 0;
		}
		
		else if( arr[mid] > key ) high = mid - 1;
		
		else low = mid + 1;
	}
	cout << 0;
}

 首先,引入头文件和命名空间,顺便定义全局数组arr :

#include <iostream>

using namespace std;

int arr[1000010];

接着是主函数 ( 定义变量和输入数组元素就不说了 ) :

int main( void )
{
	int len, mid, key, i;
	
	int low = 1, high;
	
	cin >> len >> key;
	
	for( i = 1; i <= len; i++ )
	{
		cin >> arr[i];
	}	
	
	high = len;

 然后是核心代码( 敲黑板 ):

        while循环 判断( 当low 大于 high 时退出 )

        mid存中间值 二分查找的灵魂就在于mid,根据它我们可以判断出要查元素在mid的哪儿

	while( low <= high )
	{
		mid = ( low + high ) / 2;

  判断 

       程序精髓之二  ( 非常非常非常重要 )

       当arr[mid] 等于 要查找元素时 输出位置 程序结束  这里 mid 其实当数组下标使,改变mid的值就可以定位区间。

       如果 arr[mid] 小于  要查找元素时 数组右下标 位置更新为 mid + 1 加1是因为mid的位置并不是要查找元素。

       如果 arr[mid] 大于  要查找元素时 数组左下标 位置更新为 mid - 1 减1与上述同理( 懒得写...)    

       最后( 终于写完了 ),如果找了半天啥也没有,输出0,程序结束

        if( arr[mid] == key )	 
		{	
			cout << mid; return 0;
		}
		
		else if( arr[mid] > key ) high = mid - 1;
		
		else low = mid + 1;
	}
	cout << 0;
}

好了,二分查找就写完了,然后...

        

 如果程序或代码块有什么不足的地方,请各位大佬海涵,欢迎在评论区下方留言( ^ _ ^ ) 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值