C语言:二分查找

二分查找

1.简介

二分查找,又称为折半查找,是一种在有序数组中高效查找特定元素的搜索算法。其基本思想是通过将查找区间逐步减半来逼近待查找的元素,直到找到目标或者确定目标不存在于数组中。以下是二分查找算法的主要概念和步骤:

基本原理

1. 有序性:二分查找的前提是数组必须是有序的,无论是升序还是降序,但通常默认为升序排序。
2. 区间划分:每次查找都将当前查找区间一分为两半,通过与区间中间元素的比较来决定下一步在哪个子区间继续查找。
3. 终止条件:当找到目标元素时返回其索引,或查找区间为空(即开始索引大于结束索引)时表明目标不在数组中。

算法步骤

1. 初始化:定义两个指针,`low`和`high`,分别指向数组的起始位置(通常是0)和末尾位置(数组长度减1)。
2. 循环:在`low <= high`的情况下执行循环:
   - 计算中间位置`mid = low + (high - low) / 2`(向下取整,避免溢出可写作`mid = low + ((high - low) >> 1)`)。
   - 比较`array[mid]`与目标值:
     - 若相等,找到了目标,返回`mid`。
     - 若`array[mid] < 目标值`,说明目标在右半区,更新`low = mid + 1`。
     - 否则,目标在左半区,更新`high = mid - 1`。
3. 未找到:循环结束后,说明目标不在数组中,返回特定值(如-1)或`NULL`。

 优点

-效率高:二分查找的时间复杂度为O(log n),在大规模数据集上显著优于线性查找(O(n)。
-简洁:算法实现简单,逻辑清晰。

 缺点

- 前提限制:要求数据事先有序,增加额外排序开销。
- 不适合频繁插入删除:频繁变动的动态数据结构不适合直接应用二分查找,因为保持有序性成本较高。

通过理解和掌握二分查找,可以有效提高在有序数组中搜索元素的效率,尤其适用于大数据量的场合。

2.代码

#include<stdio.h>
int main()
{
	int arr[] = { 5,12,15,19,22,35,36,40,67,78,82 };
	int k;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组长度
	int left = 0;//第一位数
	int right = sz - 1;//最后一位数
	while (left <= right)
	{
		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;
}
 
 

3.总结

通过比较折半查找的平均查找长度,同顺序查找相对比,明显折半查找的效率要高。但是折半查找算法只适用于有序表,同时仅限于查找表用顺序存储结构表示。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值