《編程思維與實(shí)踐》1036.數(shù)組相對(duì)排序
題目


思路
顯然是桶排序:將B出現(xiàn)在A中的元素放在一個(gè)桶里,沒出現(xiàn)在A中的元素放在另一個(gè)桶里,兩個(gè)桶分別排序后再輸出.
代碼
法一:
typedef?struct{int?number;int?pos;}Data;
int?cmp1(const?void?*a,const?void?*b)??//按出現(xiàn)在A中的相對(duì)位置排
{
????Data?*m=(Data*)a;
????Data?*n=(Data*)b;
????return?m->pos-n->pos;
}
int?cmp2(const?void?*a,const?void?*b)??//升序
{
????int?*m=(int*)a;
????int?*n=(int*)b;
????return?*m-*n;
}
int?main()
{
????int?m;
????scanf("%d",&m);
????int?A[m];
????for(int?i=0;i<m;i++)
????{
????????scanf("%d",&A[i]);
????}
????int?n;
????scanf("%d",&n);?
????int?B[n];
????for(int?i=0;i<n;i++)
????{
????????scanf("%d",&B[i]);
????}
????Data?temp1[n];??//存出現(xiàn)在A中的元素對(duì)應(yīng)的值和位置
????int?temp2[n];??//存未出現(xiàn)在A中的元素
????int?j=0,k=0;
????for(int?i=0;i<n;i++)
????{
????????int?r;
????????for(r=0;r<m;r++)
????????{
????????????if(B[i]==A[r])???//出現(xiàn)在A中
????????????{
????????????????temp1[j].number=B[i];??
????????????????temp1[j].pos=r;???
????????????????j++;
????????????????break;
????????????}
????????}
????????if(r==m)???//沒在A中
????????{
????????????temp2[k]=B[i];
????????????k++;
????????}
????}???
????qsort(temp1,j,sizeof(Data),cmp1);
????qsort(temp2,k,sizeof(int),cmp2);????
????for(int?i=0;i<j;i++)
????{
????????printf("%d?",temp1[i].number);
????}???
????for(int?i=0;i<k;i++)
????{
????????printf("%d?",temp2[i]);
????}
}