c语⾔程序⼆分法求解,C语⾔⼆分法查算法(附带源码)顺序查是从第⼀个数据开始⽐较,直到到⽬标数据。当数据量较⼤时,顺序查的效率就会降低。
将数据进⾏排序以后,我们就可以使⽤另⼀种更加有效的查⽅法:⼆分法查。⼆分法查的思想是,对于已经按照从⼩到⼤的顺序排列好的 N 个数据,取出排在中间位置的数据进⾏⽐较,如果等于要的数则查结束;如果⽐要的数⼤,则要的数据⼀定在左边部分,则在左边数据中继续⽤类似的⽅法查;如果⽐要的数⼩,则在右边数据中继续⽤类似的⽅法查。在整个过程中,查的数据范围每次都被分成两半,因⽽称为⼆分法查。
例如,在有序数据 {26,30,45,55,60,61,62,65,70,78,99} 中查 55 的过程如图 1 所⽰。
图 1:⼆分法查
上⼀节《C语⾔顺序查算法》中的问题⽤⼆分法实现查的代码如下:
C语⾔代码清单 1:根据输⼊的个⼈成绩获得考试排名(⼆分法查)
#include
#include
int main( )
{
int i,S;
int a[100];
printf("从低到⾼输⼊成绩(空格分隔),\n");
printf("全部输⼊后,输⼊0并回车!\n");
for(i=0;i<100;i++){ //⽤for循环给数组元素赋值
scanf("%d",&a[i]);
if(a[i]==0) break; //接收到0,则退出循环
}
printf("名次查询(输⼊0结束查询):\n");
int L,R,mid,R0=i;
do{
printf("输⼊成绩:");
scanf("%d",&S);
if(S==0) break; //输⼊0结束查询
L=1;R=R0;
while(L<=R){
mid=(L+R)/2;
printf("%d %d %d\n",L,mid,R);
if(a[mid-1]==S) break; //到⽬标退出循环
if(a[mid-1]>S) R=mid-1; //进⼊左半区间
else if(a[mid-1]
printf("%d A %d\n\n",L,R);
}
if(a[mid-1]==S)
printf("%d\n",mid); //输出名次
else
c语言搜题软件推荐
printf("未到该成绩!");
}while(S!=0);
system("pause");
return 0;
}
运⾏结果:
从低到⾼输⼊成绩(空格分隔),
全部输⼊后,输⼊0并回车!
51 60 65 77 83 85 87 99 0
名次查询(输⼊0结束查询):
输⼊成绩:60
1 4 8
1 A 3
1 2 3
2
上述代码中,录⼊的成绩从⼤到⼩排序,⽤ L 指⽰最左端数据,R 指⽰最右端数据,mid 指⽰中间位置的数据。查值与 mid 处的数据相⽐较,如果 mid 处的数⼩,则查值在其左侧,改变 R 的值;如果 mid 处的数⼤,则查值在其右侧,改变 L 的值;继续在 L 和 R 之间的数据中⽤同样的⽅法查,直到到要的数或 L 和 R 位置重合。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论