Problem G: 排序练习00(难度:5)
Description
话说前面的排序太简单了, 没有丝毫的挑战性, 如今给你 N 个整数, 除了要排序之外, 还要知道每个数原来的位置.
Input
输入数据有多组, 每组数据第一行包含一个数字 N( 0 < N <= 100), 代表有 N 个整数, 第二行紧跟着输入 N 个数.
Output
对于每组输入,输出数据有两行,第一行代表把数从大到小排序后的序列,第二行第 i 个数代表排序后第一行第 i 个数在原数组中的位置.如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面.每两组相邻的输出之间存在一个空行.
Sample Input
5
1 2 3 4 5
2
1 1
Sample Output
5 4 3 2 1
5 4 3 2 1
1 1
2 1
HINT
对于第一组输入排序后序列为“5 4 3 2 1”, "5" 在元数组中第 5 个, “4” 原数组中第 4 个...以此类推,最终输出如样列所示; 对于第二组输入, 排序后序列为“1 1”, 由于要求如果存在一样的数, 则序号大的优先序号小的, 所以第 2 个“1”需要排在在第 1 个 “1”前面.输出如样列所示.
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n,a[101],b[101],k=0;
while(scanf("%d",&n)!=EOF)
{
if(k!=0)
printf("\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
b[i]=i+1;
}//第二行第 i 个数代表排序后第一行第 i 个数在原数组中的位置
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]<a[j+1]||(a[j]==a[j+1]&&b[j]<b[j+1]))
//如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
int y=b[j];
b[j]=b[j+1];
b[j+1]=y;
}
}
}
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",a[i]);
else
printf("%d",a[i]);
}
printf("\n");
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",b[i]);
else
printf("%d",b[i]);
}
printf("\n");
k++;
}
return 0;
}