XYNUOJ 1223: 数组排序

                                                       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;
}

猜你喜欢

转载自blog.csdn.net/qq_30007603/article/details/81411824