1223: 数组排序
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入一个数组的值,求出各个值从小到大排序后的次序。
输入
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。
输出
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
样例输入
1
68
15
1 70 25 79 59 63 65 6 46 82 28 62 92 96 43
样例输出
1
1 11 3 12 7 9 10 2 6 13 4 8 14 15 5
#include <stdio.h>
#include <algorithm>
using namespace std;
struct order{
int x;
int y; //初始次序
int z; //排序后次序
}a[10001];
bool cmp(order a,order b){ //排序数组的大小
return a.x==b.x?a.y<b.y:a.x<b.x;
}
bool cmp2(order a,order b){ //排序 排序后的次序
return a.y<b.y;
}
int main()
{
int n,i;
while(~scanf("%d",&n)){
for(i=1;i<=n;i++){
scanf("%d",&a[i].x); //数组元素值
a[i].y=i; //初始次序
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++) a[i].z=i; //保存从小到大排序后的次序
sort(a+1,a+n+1,cmp2); //按原始次序排序 排序后的次序
for(i=1;i<=n-1;i++) printf("%d ",a[i].z); //i<=n-1而不是i<=n,因为最后一位输出不带空格
printf("%d\n",a[i].z); //在i跳出循环即i=n时,再输出最后一位并换行
}
return 0;
}