ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言程序设计:二分查找(折半查找)

2021-12-14 23:58:31  阅读:147  来源: 互联网

标签:折半 right num int mid C语言 查找 left


文章目录

C语言程序设计:二分查找(折半查找)

1.什么是二分查找

二班查找又称折半查找,他是一种高效率的查询方法。

2.二分查找的优点

高效,减少查询次数,查找的速度快,平均性能好(貌似 快速排序 也是),非递归实现(我觉得也是优点吧)。

3.二分查找的缺点

1)必须采用顺序存储结构。

2)必须按关键字大小有序排列。

说人话就是 数据得是数组,且从大到小 或者 从小到大 等进行排好序。

4.二分查找原理

1

针对已经排列好的数组,假如我判断6是否在这个数组内,如果是返回ture,否则返回false。

我们在数组的最左边定义一个left,在最右边定义为right,中间的mid则为(left+right)/2

我们用mid的值与6做对比,发现mid的值为5,6比5大,则mid左边的所有数据都抛弃掉,同时,我们把left的值设为mid+1,right保持不变

NueXini2

则left则到了6这个位置,则mid可以是7或者8这个位置,不影响操作。假设mid在的7位置

我们这时在比较6与mid的值比较,发现mid的值为7,6比7小,则mid右边的所有数据都抛弃掉,同时right变为mid-1

NueXini3.png

此时,我们的mid位置为(left+right)/2=6,mid的第6位置的值为6,是我们要查找的6,则 return true。


但是,假如我们查找的数不在这个数组里面呢?

首先,我们定义一串这样的数组a,要查找的数为60

NueXini4

定义a起始位置为left,末尾位置为right,则mid=(0+9)/2=4(4或者5都可以),a[mid]=a[4]=45

60比a[mid]=45大,所以我们可以舍弃mid左边所有的数据,同时,left=mid+1即left=5,right不变

NueXini5

此时mid=(left+right)/2=(5+9)/2=7,a[mid]=a[7]=74

同理,60小于74,则right=mid-1=6,left不变

NueXini6

此时只剩下两个值,mid=(5+6)/2=5或6,mid等于哪个都没问题,a[mid]=a[6]=67,我们要找的值是60,那我们继续分析的话,则right=mid-1,那left=mid=right,假如我们要找的数是67,我们就找到了,返回true,可惜我们现在找的是60,在走下去,依旧得不到结果,这样做就没有意义了,所以要使它有意义就必须满足left<=right,这便是我们进行二分查找的循环条件~~!

5.源代码实现

#include<stdbool.h>
#include<stdio.h>

bool halfsort(int need_num, int num[], int num_length);

int main()
{
	int a[] = { 11,18,22,34,45,53,67,74,89,99 };
	int len = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < len; i++)
	{
		printf("正在检测[%d]:%d\n", a[i], halfsort(a[i], a, len));
	}
	
}

bool halfsort(int need_num, int num[], int num_length)
{
	bool ret = false;
	int left = 0;
	int right = num_length - 1;//计算出数组个数,数组中下标从0开始,需要-1
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (num[mid] == need_num) {
			ret = true;
			break;
		}
		else if ( need_num < num[mid]) {
			right = mid - 1;
		}
		else {
			left = mid + 1;
		}

	}
	return ret;
}

6.后话

分析原理的时候,可能说的有点乱,大概就是那样子,可以自己琢磨分析一下,enioy it~

标签:折半,right,num,int,mid,C语言,查找,left
来源: https://blog.csdn.net/a924282761/article/details/121942764

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有