每日一题 二分查找

题目要求 : 

                在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回  -1 

解题思路:

               假设目前有一个升序数组arr[10] = {1,2,3,4,5,6,7,8,9,10}

数组下标及对应数值如图所示:

那么,假设我们要在这个数组中使用二分查找法来寻找到 7 这个数字

1、先确认数组大小

2、计算最左和最右边数组除以2的下标值(n要减1),将值存放至变量 mid;

3、 我们知道了数组的中间值,便可以开始第一次查找,若arr[mid] == key(key为要找到的数),则可以直接返回mid。

4、如上图所示,mid的值为index 4,要查找到的数7位于index 6,那么我们便可以舍弃掉左半边的值。

5、 经过第一次查找,并没有找到数字7所在位置,那么我们将 mid+1 赋值给 left(左数组坐标位置) left =5,重新计算mid的值, mid = (5+9)/2 = 7  开始新一轮二分查找。

6、若arr[mid] 的值超过key,那么key的值只能在左半部分,我们便可以将mid-1,把值赋给right,重新计算mid的值 mid = (5+6)/2 = 5

7、重复以上步骤,mid = (6+6)/2 = 6  ==  key所在位置的值,成功找到key。

代码部分:

#include<stdio.h>

int bin_search(int arr[], int left, int right, int key);
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字

int bin_search(int arr[], int left, int right, int key) {
	int mid ;
	while (left<=right) //边界条件
	{
		mid = (left + right) / 2;
		if (arr[mid]==key)
		{
			return mid;
		}
		else if (arr[mid]<key)
		{
			left = mid + 1;
		}
		else {
			right = mid - 1;
		}
	}
	return -1; //若没找到,返回-1
}

int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int key;
	int n = sizeof(arr) / sizeof(arr[0]);
	scanf_s("%d", &key);//输入用户想查找的数
	int result = bin_search(arr,0,n-1,key);
	if (result != -1)
	{
		printf("你要找的数%d在数组坐标%d中", key, result);
	}
	else {
		printf("没找到");
	}
}

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值