二分查找基本原理

何为二分查找?二分查找也叫折半查找,但是二分查找要求线性表是有序表的,即表中的元素按关键字有序排列。所以此方法只适用于顺序表,而不能用于链式存储结构。如果使用暴力的遍历方式来查找目标元素,时间复杂度为 O(n);然而使用二分查找,时间复杂度为 O(log₂n)。因此,二分查找是一种高效率的查找方法。

二分查找思路:假设在数组 nums[10]={1,2,3,4,5,6,7,8,9,10} 中查找目标元素 target

图中深色为查找区间;定义查找区间左端点 left=0,右端点 right = 9 (最后一个元素下标)。确定查找区间的中间端点 mid=(left+right)/2  (默认向下取整) ;然后将目标元素 target 与 中间端点值nums[mid] 比较:

如果 nums[mid] ==target;说明找到该元素,返回其下标 mid;

如果 nums[mid] > target;说明 target 一定在区间 [left, mid-1] (图中深色区域),那么就跟新右端点 right=mid-1;

如果 nums[mid] < target;说明 target 一定在区间 [mid+1, right] (图中深色区域),那么就跟新右端点 left=mid+1;

上诉的步骤①②③只是一次查找的过程;所以我要通过循环来不断跟新查找区间 leftright,即是 while(left<=right)中,重复步骤①②③;如果一直执行到循环结束,说明数组 nums 中不存在 target 这个元素。那么就要返回一个负数表示没有此元素 (负数有代表性,因为数组下标不可能为负数)。

#include<stdio.h>
#include<stdlib.h>
int binartsearch(int* nums, int n,int target)
{
	int left = 0, right = n - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (nums[mid] == target)
			return mid;
		else if (nums[mid] > target)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return -1;    //-1表示找不到target元素
}
int main()
{
	int ans[10] = { 2,4,5,1,7,8,10,9,3,6 };
	int target = 0;
	printf("输入查找元素:");
	scanf("%d", &target);
	for (int i = 0; i < 10; i++)  //二分查找基于数组元素有序(冒泡排序)
	{
		for (int j = 0; j < 10 - i - 1; j++)
		{
			if (ans[j] > ans[j+1])
			{
				int tmp = ans[j];
				ans[j] = ans[j + 1];
				ans[j + 1] = tmp;
			}
		}
	}
	int val = binartsearch(ans, 10, target);   //返回查找值的下标
	if (val == -1)
		printf("没有此元素\n");
	else
		printf("此元素下标为%d", val);
	return 0;
}

如果对你有帮助的话,留个赞在走吧!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

她没有救赎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值