C++二分查找(最全)

前言:

大家好!

今天我们一起来学习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所有博主万事如意,平平安安!

记得关注哦~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值