多关键字折半查找

折半查找的查找过程:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。

每条待查记录包含关键字项和其他项,如关键字项为15,其他项为该记录在查找表里的原序号4。

对无序表的查找,还需要事先排列成有序表,再进行折半查找。

输入:

5 (记录的条数)

各记录项:如 32 1

输出:

已按关键字排列好的非递减序列:如 (16 2)(20 5)(32 1)(35 3)(91 4)

找不到时输出: error

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 11↵
  2. 5 1↵
  3. 13 2↵
  4. 19 3↵
  5. 21 4↵
  6. 37 5↵
  7. 56 6↵
  8. 64 7↵
  9. 75 8↵
  10. 80 9↵
  11. 88 10↵
  12. 92 11↵
  13. 56↵
以文本方式显示
  1. (5 1)(13 2)(19 3)(21 4)(37 5)(56 6)(64 7)(75 8)(80 9)(88 10)(92 11)↵
  2. (56 6)↵
1秒64M0
测试用例 3以文本方式显示
  1. 10↵
  2. 5 3↵
  3. 20 4↵
  4. 100 5↵
  5. 75 6↵
  6. 63 7↵
  7. 19 8↵
  8. 18 9↵
  9. 23 10↵
  10. 32 11↵
  11. 35 12↵
  12. 36↵
以文本方式显示
  1. (5 3)(18 9)(19 8)(20 4)(23 10)(32 11)(35 12)(63 7)(75 6)(100 5)↵
  2. error↵
1秒64M0

 

#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");  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值