回复
#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");
}
}
使用二分查找法能够大幅提高查找效率,尤其针对大量的数据需要处理时
虽然使用二分查找法能够提升查找效率,但是大多时候我们处理的数据并不是排序好的,因此我们需要再花费大量的时间用于对数组进行排序,而选择排序和冒泡排序也需要耗费O(n²),即使占用大量的空间使用归并排序也需要花费O(nlog2 n)。
综上所述,对于一定量的数据并不是选择二分查找法就能获得更高的效率,我们应该权衡要处理的数据进行判断,使用更高效的方法进行数据处理
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2023-12-30 22:49:50修改
赞
收藏
回复
相关推荐