折半查找(算法竞赛入门)

定义:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

折半查找思路:

折半查找首先需要要查找的序列是有序的(下面的讨论基于递增有序)。假设Array[start , … , end]为当前的查找区间,首先确定该区间的中间位置,即mid = (start + end) / 2;然后将待查找的k值与Array[mid]做比较,此时有三种情况:第一,若k = Array[mid]。则查找成功,返回mid即为查找到的位置;第二,若k > Array[mid]。则说明k值在Array序列的右半边,此时的查找序列将变为Array[mid+1, … , end];第三,若k < Array[mid]。则说明k值在Array序列的左半边,此时的查找序列将变为Array[start, … , mid-1]。不断地递归进行下去,直到区间的长度小于1时查找结束。

算法描述:

在折半查找时要通过不断的比较值来确定是否可以找到需要的值,当输入的值等于以有的中间值后输出结果,否则比较输入的值与中值的大小,如果小于中值则改变high指针的指向,将其指向中值前一个值,否则将low指针指向中值的后一个值。

以下代码为小学期中一部分折半查找的代码

int low=0;int i=0;printf("运行折半查找\n");
int high,mid;
high=count-1;
while(low<=high)
{
 mid=(low+high)/2; 
 printf("%d\n",p[low]->student.StuID);
 printf("%d\n",p[high]->student.StuID);
if(key == p[mid]->student.StuID)
 return mid;
else if(key<p[mid]->student.StuID)
 high=mid-1;
else 
 low=mid+1;
}
return -1;

放上引用过的的折半查找网址。https://blog.csdn.net/zmeilin/article/details/81139814

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值