鱼C论坛

 找回密码
 立即注册
查看: 7278|回复: 12

[争议讨论] 折半查找算法

[复制链接]
发表于 2011-12-5 17:51:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 p62273470 于 2011-12-5 17:51 编辑

以下讨论的有序数列均是从小到大排列的!
什么是折半查找?
答:折半查找是一种效率较高的查找算法。折半查找的先决条件是查找表中的数据元素排列必须是有序的。折半查找先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,可以将查找区间缩小一半,它可以明显减少比较次数,提高查找效率。


方法分析:
折半查找先以有序数列的中点位置为比较对象,比较会产生3种情况,一种是待查找值大于中点位置的数,此时我们要把比较区间缩小为有序数列的后半部分;一种是待查找值小于中点位置的数,此时我们要把比较区间缩小为有序数列的前半部分;一种是待查找值等于中点位置的数,此时查找成功。这样不断比较,直到查找成功或者区间小于0,就停止查找!

数据结构设计:
有序数列:用一个数组data[size]来存放。
区间:区间用数组的两个下标表示。用整型low,high下标来表示区间的前端点,后端点。mid表示数组的中间位置下标。如:

   7   14   18   21   23   29   31   35   38    52
   ↑ low                    ↑ mid                            ↑ high
                             (mid=(low+high)/2)


代码如下:

  1. //折半查找

  2. #include<iostream.h>

  3. int Binary_Search(int *da,int s)
  4. /*da为有序数列的头指针,s是要查找的数值*/
  5. {
  6. int low,high,mid;
  7. int count; //保存查找次数
  8. int flag; //flag用来保存在数组中第几个位置查找到待查找值
  9. low=0;
  10. count=1;
  11. high=10;
  12. flag=0;
  13. while(low<=high)
  14. {
  15. mid=(low+high)/2;

  16. if(s<da[mid]) //待查找值s小于中值
  17. high=mid-1;

  18. else if(s>da[mid]) //待查找值s大于中值
  19. low=mid+1;

  20. else{ //待查找值s等于中值
  21. flag=mid;
  22. break;
  23. }
  24. count++;
  25. }
  26. cout<<"查找的次数是:"<<count<<endl;
  27. return flag+1;
  28. }

  29. void main(){
  30. int i;
  31. int s;
  32. int data[10] = {7,14,18,21,23,29,31,35,38,52};
  33. cout<<"请输入要查找的的元素:"<<endl;
  34. cin>>s;
  35. i=Binary_Search(data,s);
  36. if(i==0)
  37. cout<<"你妹,找不到所要查找的元素!"<<endl;
  38. else
  39. cout<<"所要查找的数据元素"<<s<<"的位置是"<<i<<endl;
  40. }

复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-6 06:18:16 | 显示全部楼层
算法真是中级编程知识  语言都还没入门呢  不敢看了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2014-3-15 19:46:30 | 显示全部楼层
先藏着!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-15 20:55:32 | 显示全部楼层
厉害哦 加油:shy::shy::shy::shy::shy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-15 22:02:35 | 显示全部楼层
归并排序吗????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-15 23:50:39 | 显示全部楼层
居然不设隐藏{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-11 03:20:43 | 显示全部楼层
其实算法才是程序的灵魂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-11 19:54:19 | 显示全部楼层
如果只是简单的查找,可以用 #include <alogrithm> 中的 binary_search(),upper_bound和lower_bound(). 具体可以自己去查查。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-12 08:14:39 | 显示全部楼层
谢谢楼主分享!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 04:07:24 | 显示全部楼层
ThanksFORshare
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-25 02:40:36 | 显示全部楼层
其实算法才是程序的灵魂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-25 16:03:32 | 显示全部楼层
到这,我好兴奋
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-2 16:19:09 | 显示全部楼层
比较基本的算法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 10:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表