请用折半查找法查找学生的学号。第一行n代表学生个数,接下来n行,每行按顺序输入一个学号,接下来m代表要查找的学号的个数,接下来m行,每行输入一个学号。
#include<stdio.h>#define N 35
void PaiXu(int a[],int n);
int main ()
{
int ids[N],ckids[N];
int i=0,mid,min,max,n,m,k=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&ids[i]);
}
PaiXu(ids,n);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&ckids[i]);
}
min=0;
max=n-1;
mid=n/2;
for(i=0;i<m;i++)
{
printf("%d ",mid);
while(max!=min+1)
{
if(ckids[i]==ids[mid])
{
printf("%d\n",mid);
min=mid;
mid=(min+max)/2;
k=1;
}
else if(ckids[i]>ids[mid])
{
min=mid;
mid=(min+max)/2;
if(min+1!=max)
{
printf("%d ",mid);
}
}
else
{
max=mid;
mid=(max+min)/2;
if(min+1!=max)
{
printf("%d ",mid);
}
}
}
if(k==0)
{
printf("查无此号\n");
}
k=0;
max=n-1;
min=0;
mid=n/2;
}
return 0;
}
void PaiXu(int a[],int n)
{
int i,j,t;
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}