二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现

二分查找的概念

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

实现原理

  1. 首先,假设表中元素是按升序排列,将表中的位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
  2. 否则利用中间位置记录将表分成前、后两个子表
  3. 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
  4. 重复以上过程,直到找到满足条件的记录,使查找成功。或直到子表不存在为止,此时查找不成功

图解

​编辑​

算法效率

时间复杂度为 O(log2n) 也就是说查找的最大次数为log2n

优点:查找效率高

缺点:必须采用顺序存储结构,,必须按关键字大小有序排列。

使用C语言代码实现

ini 复制代码
//二分查找
//给定一个有序数组,任意给定一个值,查找该值在数组的位置
int main()
{
	int arr[] = { 5,9,12,15,20,32,36,42,56,78,89 };
	int key = 36;  //要查找的值
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 0;//标志位
	while (left <= right)//当数组未查找完成时
	{
		int mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			printf("arr[%d]=%d\n", mid, key);
			flag = 1;
			break;//如果没有break,代码会陷入死循环
		}

	}
	if (!flag)
	{
		printf("can't find!!\n");
	}
	return 0;
}

相关推荐
会飞的架狗师30 分钟前
【SpringBoot实战】优雅关闭服务
java·spring boot·后端
爱coding的橙子2 小时前
每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h
算法·leetcode·职场和发展
zeijiershuai2 小时前
SpringBoot Controller接收参数方式, @RequestMapping
java·spring boot·后端
zybsjn2 小时前
后端项目中静态文案国际化语言包构建选型
java·后端·c#
L2ncE2 小时前
ES101系列07 | 分布式系统和分页
java·后端·elasticsearch
无限大63 小时前
《计算机“十万个为什么”》之前端与后端
前端·后端·程序员
初次见面我叫泰隆3 小时前
Golang——2、基本数据类型和运算符
开发语言·后端·golang
地平线开发者3 小时前
征程 6EM 常见 QConfig 配置解读与示例
算法·自动驾驶
南风lof3 小时前
ReentrantLock与AbstractQueuedSynchronizer源码解析,一文读懂底层原理
后端
GEEK零零七3 小时前
Leetcode 1908. Nim 游戏 II
算法·leetcode·博弈论