进阶实验8-2.1 逆散列问题 (30分)

 

 

 解题思路:

1、有效数字(非负数)存入数组b[],并将b[]升序;

2、按b数组从小到大的顺序,逐个计算hash地址pos,寻找出被使用hash地址pos(线性探测法解决冲突),再从b数组中寻找到最小的适合的数据,将此数存入ans中,并标记visit和vs数组,重复步骤2;

 

     

#include <stdio.h>
#include <string.h>
#define Max 1000
int cmp(int *x,int *y) {
    return *x-*y;
}
int main() {
    int n;
    scanf("%d",&n);
    int i,j,k=0;
    int a[n],b[n],visit[n],vs[n],ans[n];
    for(i=0; i<n; i++) {
        scanf("%d",&a[i]);
        if(a[i]>=0)
            b[k++]=a[i];
        visit[i]=0;
        vs[i]=0;
        ans[i]=0;
    }
    qsort(b,k,sizeof(b[0]),cmp);
    int flag,cnt=0;
    for(i=0; i<k; i++) {
        for(j=0; j<k; j++) {
            if(visit[j])continue;
            flag=1;
            int pos;
            for(pos=b[j]%n;;) {
                if(!vs[pos]&&b[j]==a[pos]) {
                    ans[i]=b[j];
                    vs[pos]=1;
                    visit[j]=1;
                    flag=0;
                    break;
                }
                if(!vs[pos])
                    break;
                pos++;
                if(pos==n)
                    pos=0;
            }
            if(!flag)
            break;
        }
        
    }

    for(i=0; i<k; i++) {
        if(i)
            printf(" ");
        printf("%d",ans[i]);
    }
    printf("\n");
    return 0;
}

 

posted @ 2020-03-26 21:14  跃鱼  阅读(455)  评论(0编辑  收藏  举报