给定一个hash排列 给出输入的顺序 如果多种则选择数字尽可能小的输在前面
散列函数:求余
大于N的最小的质数为散列的除数
输入样例:
11
33 1 13 12 34 38 27 22 32 -1 21
输出样例:
1 13 12 21 33 34 38 27 22 32
#include<stdio.h>
struct node{
int in; //入度,记录与本来应该的位置差多远,相关地方走一个之后-1,为0即可输出
int root; //根 记录本来应该在的位置.如果输出的在判断的根和判断的值中间,则判断的入度--
int val;
}num[1002];
int GetInput(int N)
{
int i,x,empty=0;
for(i=0;i<N;i++)
{
scanf("%d",&x);
if(x<0)
{
num[i].in=-1;
num[i].root=-1;
empty++; //记录空值
}
else{
if(x%N==i)
{
num[i].in=0;
num[i].val=x;
num[i].root=x%N;
}
else{
num[i].val=x;
int temp=i-x%N;
if(temp<0)
temp+=N; //轮到第二圈了
num[i].in=temp;
num[i].root=x%N;
}
}
}
return empty;
}
void Output(int N,int empty)
{
int i,j,x,y,mini;
for(j=0;j<N-empty-1;j++)
{
int min=65536;
for(i=0;i<N;i++)
{
if(num[i].in==0&&num[i].val<min)
{
mini=i;
min=num[i].val;
}
}
printf("%d ",num[mini].val); //找最小的
num[mini].in=-1;
for(i=0;i<N;i++)
{
if(num[i].in>0)
if((i<num[i].root&&(mini<=i||mini>=num[i].root))||(i>num[i].root&&mini<i&&mini>=num[i].root)) //输出的在中间
num[i].in--;
}
}
for(i=0;i<N;i++)
{
if(num[i].in==0)
printf("%d",num[i].val);
}
}
int main()
{
int N,i,x,empty;
scanf("%d",&N);
empty=GetInput(N);
Output(N,empty);
return 0;
}