折半查找法:折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a[0]~a[4],要查找的数是X,其基本思想是:设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素 a[m]比较,若X等于a[m],即找到,停止查找;否则,若X大于a[m],替换下限l=m+1,到下半段继续查找;若X小于a[m],换上限h=m- 1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。
该方法是查找的范围不断缩小一半,所以查找效率较高。
相关问题:
《C程序设计》(第三版)6.9
《C程序设计教程》7.9
Solution by Mutoo:
- #include<stdio.h>
- #define LEN 14
- //定义数字个数
- #define Debug 1
- //使能调试模式
- void main()
- {
- //定义一个从小到大排列的数组
- float a[LEN]={1,2,3,5,8,13,21,34,55,89,144,233,377,610},m;
- int i,left,mid,right;
- if(!Debug)
- {
- printf("Please input %d numbers:/n",LEN);
- for(i=0;i<LEN;i++)
- scanf("%d",&a[i]);
- }
- for(;;)
- {
- for(i=0;i<LEN;i++)
- (i>0)?printf(","):0,printf("%.f",a[i]);
- printf("/nWhich number would you wanna get?/t");
- scanf("%f",&m);
- //初始化标识
- left=0,right=LEN-1;
- //终止条件为左右两端标识倒置
- while(left-right<=0)
- {
- mid = (left+right)/2;
- //若标识位置或中点即要寻找的值,将标识传给mid并终止搜索
- if(a[left]==m) mid=left;
- if(a[right]==m) mid=right;
- if(a[mid]==m) break;
- else if(m<a[mid]) right=mid-1; //从中点前一个标识继续下一轮搜索
- else if(a[mid]<m) left=mid+1; //从中点后一个标识继续下一轮搜索
- }
- //搜索结束后,叵左右两端标识倒置,即没有找到所要查找的数,否则输出结果
- if(left>right)
- printf("couldn't find it!/n");
- else
- printf("the number %f is in col %d./n",m,mid+1);
- }
- }