C语言 浅谈二分查找

一、前言

当我们需要在一串有序的数组中查找某个数字在这个数组中的排名时,我们该怎么做呢?还在用循环遍历整个数组后,找到跟目标相同的元素后打印下标的方法?不如试试二分查找,更快更高效,你值得拥有

二、二分查找

二分查找法,又叫折半查找法。适合用在按顺序排列的数据中的查找行为,效率较高,这是二分查找法的优点,但也是其局限性。例如我们需要在一个按升序排列的数组中找到目标,我们可以以数组的中位数为基准,将数组分成两个子集,先将目标与中位数进行比较,若相同则直接返回中位数;若目标小于中位数则在中位数左侧的子集(数组为升序)继续使用二分查找,不断缩小查找范围,直到找到目标。同理,若目标大于中位数则在中位数右侧的子集中查找。

三、如何用C语言实现二分查找

(1)确认数组的大小

int main()
{
	int arr[] = {1,2.3,4,5,6,7,8,9,10};
	int sz = size(arr)/sizeof(arr[0]);//数组的总大小除以数组首元素的大小,即可求出数组大小
	int left = 0; //数组下标都是从0开始的
	int right = sz-1; //数组最后元素的下标为数组大小-1
}

(2)确认数组的中位数下标

int main()
{
	int mid = (left+right)/2;
}

注意:
若 left 与 right 之和为奇数,除以2后得到的数会有小数点。而这里定义的mid是以整数的形式存储,在C语言中,不会进行我们生活中常用的四舍五入的方式计算,而是会将小数部分舍弃后存储。假设(left+right)/2的结果为4.5,则mid的值就为4

(3)比较目标与中位数的大小

若目标等于中位数,直接返回中位数的下标;若目标大于或小于中位数,则将left或者right的值改变,按新的值重新计算中位数,直到找到目标为止;而当left的值大于right的值时,就代表在该数组中没有目标

#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 k = 0;
	printf("请输入需要查找的1-10之间数字:");
	scanf("%d",&k);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (k > arr[mid]) //若K大于中位数mid
		{
			left = mid + 1; //left等于mid右边的数
		}
		else if (k < arr[mid]) //若K小于中位数mid
		{
			right = mid - 1; //right等于mid左边的数
		}
		else
		{
			printf("找到了,数字下标是%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值