前言:
大家好!
今天我们一起来学习C++之二分查找~~~
有的人会说:“哎呀!我不理解什么叫二分查找呢!”;
有的人会说:“我已经会了,为什么还要看这篇博客呢?”;
没事,别着急,无论是会还是不会,这篇博客既可以帮不会的人学懂,也可以帮会的人复习,请不要划走!
今天分为5个板块:
1.什么叫“二分查找?”
2.“二分查找”的缺是什么?
3.“二分查找”怎么实现?
4.“二分查找”易错的地方在哪?
5.今天的作业是什么?(下一篇博客讲解)
一、什么叫“二分查找”?
“二分查找”简单来说就是排除法,
就是先定义3个变量分别存储头的数据、尾的数字和中间的数据,
并排序(用什么方法都可以,例如sort,冒泡都可以),
排完序后找到头、尾和中间,
存储在3个变量里。
判断find_(要找的数)是否大于或小于中间,
如果比它小,就把尾改成中间,中间改成头加尾除以2,
如果比它大,就把头改成中间,中间改成头加尾除以2,
如果和它相等,就输出修改后等于find_的下标,
如果头大于尾或者相等或差1,
那么就输出“-1”;
二、“二分查找”的优缺点是什么?
“”二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难;
三、 “二分查找”怎么实现?
之前我们在“什么叫“二分查找””中了解了实现二分查找的步骤,
现在,就让我们让理论变成代码吧!
上代码:
#include <bits/stdc++.h>//1
#include <algorithm>
using namespace std;
int SR[10];//2
int t,w,z;
int t1,w1,z1;
int find_;
int cz()//3
{
while(t <= w)
{
if(SR[z] > a) t = z + 1; //如果中间大于要找的数,那么左边等于中间的角标+1
if(SR[z] > a) w = z - 1; //如果中间小于要找的数,那么右边等于中间的角标-1
if(SR[z] == a) return z; //找到了
if(t == w) return -1;//没找到
}
}
int main()//4
{
w1 = 10;
cin>>find_; //a是要找的数
for(int i = 0;i < 10; i++)
{
cin>>SR[i];
}//5
sort(SR , SR + 10);
cout<<cz();
return 0;//6
}
我把整个代码分成了5部分,
分别是:
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;(基本部分)
int SR[10];
int t,w,z;
int t1,w1,z1;
int find_;(定义部分)
int cz()
{
while(t <= w)
{
if(SR[z] > a) t = z + 1; //如果中间大于要找的数,那么左边等于中间的角标+1
if(SR[z] > a) w = z - 1; //如果中间小于要找的数,那么右边等于中间的角标-1
if(SR[z] == a) return z; //找到了
if(t == w) return -1;//没找到
}
}(查找部分)
int main()
w1 = 10;
cin>>find_; //a是要找的数
for(int i = 0;i < 10; i++)
{
cin>>SR[i];
}(输入部分)
sort(SR , SR + 10);
cout<<cz();
return 0;
(调用部分)我们一部分一部分来看:
1.基本部分
用处:
相当于是程序的胸,
里面包含头文件、命名空间等;
2.定义部分
用处:
相当于是肺和小、大肠,
定义此程序需要的变量,
例如SR【10】;
3.查找部分
用处:
相当于是程序的心脏,
所有二分查找的步骤全在这里;
4.输入部分
用处:
相当于是程序的五官,
输入所有变量;
5.调用部分
用处:
相当于是程序的大脑,
调用函数“cz”;
我先讲难的部分:
1.查找部分(
int cz() { while(t <= w) { if(SR[z] > a) t = z + 1; //如果中间大于要找的数,那么左边等于中间的角标+1 if(SR[z] > a) w = z - 1; //如果中间小于要找的数,那么右边等于中间的角标-1 if(SR[z] == a) return z; //找到了 if(t == w) return -1;//没找到 } }
)
while(t <= w) //左边必须小于右边,否则退出循环
{
}
四、“二分查找”易错的地方在哪?
四/1:
mid 为什么是left+(right-left)/2?
如果当left 和 right 很大的时候,会溢出,超过int最大值,所以使用right-left 来保证不会溢出。
四/2:写代码易错点, left<=right 是循环的结束条件,当left比right大时,说明没有找到对应的值。
五、今天的作业是什么?
1.使用二分查找实现找到火车上的数
输入:
第一行是n,n是火车的列数(0 < n <= 100);
第二行是数组hc,下标就是n;
输出:
输出未排序前火车的下标;
今天我就讲到这里,祝CSDN所有博主万事如意,平平安安!
记得关注哦~~~