题目正文
输入一个数组的值,求出各个值从小到大排序后的次序。
输入
输入有多组数据。
每组输入的第一个数为数组的长度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<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct E
{
int x,y,z;
}list[10005];
bool cmp(E A,E B)
{
return A.x<B.x;
}
bool cmp1(E A,E B)
{
return A.y<B.y;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(list,0,sizeof(list));
for(int i=1;i<=n;i++)
{
scanf("%d",&list[i].x);
list[i].y=i;
}
sort(list+1,list+n+1,cmp);
int num=0;
for(int i=1;i<=n;i++)
{
if(i>1 && list[i].x==list[i-1].x)
num++;
list[i].z=i-num;
}
sort(list+1,list+n+1,cmp1);
for(int i=1;i<=n;i++)
{
printf("%d",list[i].z);
if(i!=n)
cout<<" ";
}
printf("\n");
}
return 0;
}
总结
我觉得这个题挺难的,一开始我连题目都看错了,一直提交都是错的,后来我看了一下别的同学代码,在参考下完成了这道题,首先学会了memset()函数,是一个初始化函数,作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。后来是sizeof()函数,sizeof() 是一个判断数据类型或者表达式长度的运算符。