折半查找的查找过程:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
每条待查记录包含关键字项和其他项,如关键字项为15,其他项为该记录在查找表里的原序号4。
对无序表的查找,还需要事先排列成有序表,再进行折半查找。
输入:
5 (记录的条数)
各记录项:如 32 1
输出:
已按关键字排列好的非递减序列:如 (16 2)(20 5)(32 1)(35 3)(91 4)
找不到时输出: error
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<math.h>
struct node{
int key,value;
};
void merge(struct node b[],int n1,struct node c[],int n2,struct node a[],int n)
{
int i=0,j=0,k=0,u;
while(i<n1&&j<n2)
{
if(b[i].key<=c[j].key)
{
a[k]=b[i];
i++;
}
else
{
a[k]=c[j];
j++;
}
k++;
}
if(i==n1)
{
for(u=k;u<n;u++,j++) a[u]=c[j];
}
else
{
for(u=k;u<n;u++,i++) a[u]=b[i];
}
}
void mergesort(struct node* a,int n)
{
int i;
int n1,n2;
n1=floor((float)n/2);
n2=ceil((float)n/2);
if(n>1)
{
struct node b[n1],c[n2];
for(i=0;i<n1;i++) b[i]=a[i];
for(i=0;i<n2;i++) c[i]=a[i+n1];
mergesort(b,n1);
mergesort(c,n2);
merge(b,n1,c,n2,a,n);
}
}
int main(){
int n,i,j,temp;
scanf("%d",&n);
getchar();
struct node a[n];
for(i=0;i<n;++i)
{
scanf("%d%d",&a[i].key,&a[i].value);
getchar();
}
int s,max=n-1,min=0,mid,flag=1;
scanf("%d",&s);
mergesort(a,n);
while(1)
{
mid=(max+min)/2;
if(a[mid].key==s) break;
else
{
if(max-min==1)
{
flag=0;
break;
}
if(a[mid].key>s) max=mid;
else min=mid;
}
}
for(i=0;i<n;++i) printf("(%d %d)",a[i].key,a[i].value);
printf("\n");
if(flag) printf("(%d %d)\n",a[mid].key,a[mid].value);
else printf("error\n");
}