一. 二分查找简述
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;
}
好了,二分查找就写完了,然后...
如果程序或代码块有什么不足的地方,请各位大佬海涵,欢迎在评论区下方留言( ^ _ ^ )