进阶实验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; }
勤能补拙,熟能生巧