详解二分查找

Posted 小倪同学 -_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解二分查找相关的知识,希望对你有一定的参考价值。

引言

如何在一组递增数列中查找一个数,之前我们已经学习了顺序查找,就是按顺序一个个查找,但是当我们查找一个很大的数的时候,例如231(大约21亿)这时按顺序查找就会很繁琐,需要搜寻231次。有没有一种查找方式既快捷又简单呢?答案是有的,例如二分查找。二分查找又称折半查找,每一次查找都会排除一半的选项,这样大大减少了运算量。

具体思路

首先确定这组数据中间位置的数,把它和我们要找的数进行比较,如果相同那么这个数就找到了,如果不同就比较这两个数。若中间数大于要找的数就排除中间数右边的数据,并把所找的中间数当做末位,取它和首位的中间数与要找的数进行比较。若中间数小于要找的数就排除中间数左边的数据,并把所找的中间数当做首位,取它和末位的中间数与要找的数进行比较。重复上述操作直到找到为止。

代码实现

#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int k = 0;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,arr[%d]=%d\\n", mid,k);
			break;
		}
	}
	if (left>right)
	{
		printf("数组中没有这个数\\n");
	}
	return 0;
}

代码逐句分析

	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

创建一个递增数组

	int k = 0;
	scanf("%d", &k);

输入要查找的数

	int sz = sizeof(arr) / sizeof(arr[0]);

计算数组中元素个数`

int left = 0;
int right = sz - 1;

确定数组的首位和末位

while (left <= right)

确定循环条件,当满足左下标小于等于右下标时进入循环。

mid = (left + right) / 2;

找出中间数

while (left <= right)
{
	mid = (left + right) / 2;
	if (arr[mid] > k)
	{
		right = mid - 1;
	}
	else if (arr[mid] < k)
	{
		left = mid + 1;
	}
	else
	{
		printf("找到了,arr[%d]=%d\\n", mid,k);
		break;
	}
}

对应上文二分查找的具体思路

if (left>right)
{
	printf("数组中没有这个数\\n");
}

左下标大于右下标意味着数组中没有要找的数。

运行结果演示

在这里插入图片描述
在这里插入图片描述

分析与总结

二分查找可以很快得在递增数列中找到我们要找的数,但是它有很大的局限性。

上文演示了二分查找应用于递增数列,不难看出二分查找还可以应用与递减数列,这个留给大家去思考。

以上是关于详解二分查找的主要内容,如果未能解决你的问题,请参考以下文章

二分查找详解

java 二分查找法

二分查找算法案列详解

详解二分查找算法

《详解二分查找》视频解说

二分查找算法详解