在一个有序数组里找到一个数字K【二分查找法】

目录

思路分析

上代码


思路分析

表达有序数组:arr[ ]={1,2,3,4,5,6,7,8,9,10};

假定查找数字5,需要知道5在数组arr[ ]中的下标,下标应为4,即arr[4]

求数组元素个数:int sz = sizeof(arr) / sizeof(arr[0]);//数组空间的大小除以数组一个元素的大小

最左边下标表示为:int left = 0;

最右边下标表示为:int right = sz-1;//数组元素个数-1

查找数:k;

二分中间下标:mid;

二分中间数:arr[mid];

 每一次二分查找时,找到中间下标,用中间下标 mid 表示的数字 arr[mid] 与查找数 k 比大小。

若arr[mid]>k,继续二分查找,则右下标向左移动,right = mid-1;

若arr[mid]<k,继续二分查找,则左下标向右移动,left = mid+1;

若arr[mid]=k,那么就找到了数字k。

注意,这一切的前提是left<=right;若left>right,则不可能找到k。

上代码

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz-1;
	int k = 0;
	scanf("%d", &k);

	while (left<=right)
	{
		//int mid = (left + right) / 2;
    	int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到\n");

	return 0;
}

可以看见,除了我们知道的(left+right)/2=mid,还有一种方法求mid,如下图

int mid = left + (right - left) / 2;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值