#jitoa#【更高效的查找——二分查找法】 原创

saint_kato
发布于 2023-12-30 22:43
浏览
0收藏

本博客由 金陵科技学院-开放原子开源社 朱昊翔编写

针对普通无序数组,当我们需要查找某样东西时,我们可以直接选择使用线性查找,例如对于长度为n的数组可以选择遍历其所有数据直到找到你想找的数据

int s[n];
int f=1;
for(int i=0; i<n; i++)
{
	if (s[i]==m) //m为要找的数
	{
		f=0;
		printf("该数位于%d\n",i);//i为该数在数组那个位置
		break;
	}
}
if (f)
{
	printf("没有你要找的数\n");
}

但是以上方法对于数据量较大的的数组,执行效率过低为O(n);
而对于有序数组,我们可以使用二分查找法,进行高效的查找,即二分查找法,该效率为O(log2 n)

如果找到该数则直接输出并退出循环

if (s[m]==x)   //x为要找的数
{
	printf("该数位于%d\n",m);
	break;
}

如果没找到该数则继续寻找,以下分为两种情况
第一种为位于m位置的数大于要找的数
这种情况下接下来要查找的区域应缩小到[i到m]区域

	if (s[m]>x)
	{
		j=m-1;//j为右边界且m不为要找的数,因此m也可以从查找范围内去除
	}

第二种情况为位于m位置的数小于要找的数
此时应将区域缩小到[m到j区域]

	if(s[m]<x)
	{
		i=m+1;
	}

但是在一些特殊情况下我们可能找不到该数,这时候应该提示对方:你查找的数不在该数组中
我们可以定义一个变量f,用f=1来表示没找到,f=0反之
因此我们可以将该程序核心部分融合在一起写一个函数

void found(int s[])
{
int i=0;
int j=n-1;//假设s长度为n
int f=1; //f判定是否查找到
while (i<=j)
{
	int m =(i+j)/2;
	if (s[m]==x)   //x为要找的数
	{
		f=0;
		printf("该数位于%d\n",m);//若找到则输出该数的位置并退出程序
		break;
	}
	eles
	{
		if (s[m]>x)//当查找的数大于找的数则继续寻找左半部分
		{
			j=m-1;
		}
		else//否则寻找右半部分
		{
`			i=m+1;
		}
	}
}
if (f)
{
	printf("没找到你查找的数\n");
}
}

使用二分查找法能够大幅提高查找效率,尤其针对大量的数据需要处理时
#jitoa#【更高效的查找——二分查找法】-鸿蒙开发者社区

虽然使用二分查找法能够提升查找效率,但是大多时候我们处理的数据并不是排序好的,因此我们需要再花费大量的时间用于对数组进行排序,而选择排序和冒泡排序也需要耗费O(n²),即使占用大量的空间使用归并排序也需要花费O(nlog2 n)。
综上所述,对于一定量的数据并不是选择二分查找法就能获得更高的效率,我们应该权衡要处理的数据进行判断,使用更高效的方法进行数据处理

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2023-12-30 22:49:50修改
收藏
回复
举报
回复
    相关推荐