折半查找算法(二分查找)

目录

1.引入

2.定义

3.应用

4.实现方法

5.代码实现


1.引入

在没有任何参照的情况下,要求你在一列由矮到高的队伍中找到一名正好1.7m的男生,你会怎么做呢?是从前往后找,还是从后往前找?亦或者从中间任意一个位置找起?那为什么不问问正好处在中间的那个人呢,确定他的身高是高于1.7m或者低于1.7m后,你至少能排除掉一半的人不是吗!

这也就是这种经典思想——二分法。

2.定义

在计算机科学中,折半查找,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。其时间复杂度为:O(logn) ,优点在于:

  • 平均比较次数少,查找速度快

3.应用

当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法。它对要查找的序列有两个要求:

  1. 该序列必须是有序的(升序和降序都可以)
  2. 该序列必须是顺序存储的。

假设我们这里定义了一个递增的数组,这样就可以使用折半法快速找到某一数字所对应的下标。

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

4.实现方法

二分法查找的思路如下:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。

(3)如果某一步数组为空,则表示找不到目标元素。

动画演示

5.代码实现

c语言利用折半查找的思想来找到数组中的一个数并打印在屏幕上的代码及注释如下所示:

在一个有序数组中查找具体的某个数字n(二分查找)并打印出来
#include<stdio.h>
int main()
{
	int arr[9] = { 1,2,3,4,5,6,7,8,9,9 };
	int n = 0;
	int sz = sizeof(arr) //sizeof(arr[0]);//求数组里的元素个数,总数组大小除以单个元素大小
	int left = 0;        //定义左边界
	int right = sz-1;    //定义右边界
	printf("请输入一个1~9之间的数进行查找:");
	scanf("%d", &n);
	printf("\n");
	while (left<=right)
	{
		int mid = left+(right-left)/2;//注意这个中间值要放在循环内部,因为每一次比较过后
		if (mid < arr[n])               需要重新对mid赋值
		{
			left = mid + 1;           //中间值较小,说明从中间往左的所有数都小于n,只考虑右半
                                        部分,left取中间值右边一位
		}
		else if (mid > arr[n])        //中间值较大,说明从中间往左的所有数都小于n,只考虑右半
                                        部分,right取中间值左边一位

		{
			right = mid - 1;
		}
		else
		{
			printf("数字%d对应的下标是:%d\n",n,mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到");
	}
	return 0;
}

代码运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值