二分查找有序数组元素 C语言

用到了二分查找算法

为什么要用二分查找

一个数组中,要想查找到一个想要的元素,我们常常能想到的是遍历整个数组中所有的元素。对于数据量较小的数组,这种方法还不错
但对于一个数据量很大的数组,那这种方法效率就显得不那么高了,此时更加推荐二分查找算法,运行效率比较高。
但要注意,使用二分查找有个前提,这个数组必须是个有序数组。

二分查找实例

下边以一个数据量较少的数组讲解一下二分查找算法的实现过程。
eg:在有序数组arr[]={2,7,8,9,12,24,26,36,45,67};中查找元素36,找到后输出下标。
查找元素36
先找个中间元素12,跟36比较小,就说明要查找的元素在中间元素的左边,此时直接排除掉中间元素左边的一半元素,只在右半边查找。
右半边元素的中间元素是36,刚好与要查找的元素相等,这就找到了。
由此就可以 体会到二分查找的高效了,查找一次排除掉一半的元素。
此时可以想到可以用下标来查找数组中的元素,然后进行比较查找。
刚开始左下标left=0;右下标right=9;中间元素下标为mid=(left+right)/2;
arr[4]与36相比较小,接下来之查找右半部分,左下标=mid+1=5;
此时mid=(5+9)/2=7;比较arr[7]与36,发现刚好相等,就找到了输出下标mid=7.
可能还会对如何进行多次二分查找有疑惑,此处就要用到循环去完成不断循环,直到找到要查找的元素,或已经查找完了所有元素,但没有要查找的,此时就需要一个循环条件去判断它有没有查找完所有数组元素。我么们可以想到当元素下标left<=right时就还有元素未被查找(等于时就是那个下标对应的元素还未被查找),就不断循环直到找到;当元素下标left>right就说明所有元素已被查找过了,就跳出循环 。

代码实现

接下来用代码实现
#include <stdio.h>
int main()
{
	int arr[] = { 2,7,8,9,12,24,26,36,45,67 };
	int mid,num = 36;
	int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
	int left = 0, right = sz - 1;

	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] > num)
		{
			right = mid - 1;
		}
		else if (arr[mid] < num)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标为%d\n", mid);
			break;//找到后跳出循环,不然满足循环条件就会进入死循环一直输出找到了...
		}
	}
	if (left > right)//说明是查找完了所有元素,未找到
	{
		printf("没有找到指定元素\n");
	}
	
	return 0;
}

运行结果为

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值