二分查找总结

目录

定义:

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

编写思路:

通过锚点可以不断改变检索的数组的范围,再在这个范围内通过中值和条件的比较来判断下一步的范围,不断缩小范围,最后到条件符合时跳出循环,输出结果。

注意要点:

图解

代码注释如下:

纯代码如下:


定义:

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

编写思路:

通过锚点可以不断改变检索的数组的范围,再在这个范围内通过中值和条件的比较来判断下一步的范围,不断缩小范围,最后到条件符合时跳出循环,输出结果。

注意要点:

在线性表中找的这个结果只能有一个,不确定循环的次数

图解

 

 

 

代码注释如下:

/*从小到大输入数组,输出符合条件的数组的下标*/
/*输入格式;第一行输入数组的大小和要查找的数,第二行输入要查找的从小到大排列的数组*/
/*输出格式:要查找的数的下标*/
#include<stdio.h>
int n,x;/*定义的n为数组的大小,定义的x为需要查找的数*/
int a[100];
int find() {
	int left = 0, right = n - 1;
	/*left和right是二分差找的锚点,用于确定查找的范围,这里right设为n-1是因为作为数组的下标*/
	int mid;
	/*mid用于确定中间的那个数组的下标*/
	mid = (left + right)/2 ;
	while(left <= right)
	/*while循环用于不能确定循环次数的情况下,这种二分查找十分适合。
	循环进行的条件是left<=right,当left>right时就意味着查找结束,没有符合条件的自动结束*/
	{
		if (a[mid] > x)
		{
			right = mid - 1;
		}
	/*当所选范围的数组的中值大于条件的值时就意味着所有大于中值的数都不符合条件,
	所以要更改锚点,选择较小的一部分,缩小范围*/
		if (a[mid] < x)
		{
			left = mid + 1;
		}
		/*当所选范围的数组的中值小于条件的值时就意味着所有小于中值的数都不符合条件,
	所以要更改锚点,选择较大的一部分,缩小范围*/
		if (a[mid] == x)
		{
			return mid;
		}
		/*当数组的中值符合条件后,直接返回mid mid就是要查找的数的下标*/
	}
	return -1;
	/*当不符合条件的时候,函数返回-1,用于区分有没有找到的情况*/
}

int main()
{
	scanf("%d%d", &n, &x);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}//输入数组
	int rest = find();
	/*用rest存储find函数的返回值,用于接下来的判断*/
	if (rest != -1)
	{
		printf("%d", rest);
	}
	else
	{
		printf("NO");
	}
	return 0;
}

纯代码如下:

#include<stdio.h>
int n,x;
int a[100];
int find() {
	int left = 0, right = n - 1;
	int mid;
	mid = left + right >> 1;
	while(left <= right)
	{
		if (a[mid] > x)
		{
			right = mid - 1;
		}
		if (a[mid] < x)
		{
			left = mid + 1;
		}
		if (a[mid] == x)
		{
			return mid;
		}
	}
	return -1;
}

int main()
{
	scanf("%d%d", &n, &x);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int rest = find();
	if (rest != -1)
	{
		printf("%d", rest);
	}
	else
	{
		printf("NO");
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都不会的鲨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值