解题思路: 

认真看题目,不仅仅是简单的排序而已哦。


输出是:各输入的值按从小到大排列的次序。

例如:

5

32  34   67  20  50

输出应该是:

2    3    5    1     4

因为,前面5个数排序后的是: 

20  32  34  50  67

但题目要求输出原来数据排序后的顺序。即:

32排在第2位,34排在第3为,67排在第5位,20排在第1为,50排在第4位。所以输出为:

2    3    5    1    4      


实现方法:

要定义一个结构体,用来保存原来数据以及输入的顺序,排序后的顺序。


结构体如下:

struct NODE
{
    int value;    //数值
    int original;  //原来顺序 
    int sorted;   //排序后顺序     
};


这样我们就可以:

(1)在输入时先记录原来输入的顺序;

(2)然后按数值排序,排序之后再记录排序后的顺序;(按关键字value从小到大排,排序之后给sorted赋值)

(3)最后再按原来输入的顺序排一次即可。(按关键字original从小到大排)


注意事项: 


要定义两个排序规则

第一个排序函数按输入的数值排序;

第二个排序函数按原来输入的顺序排序。


参考代码:

#includeusing namespace std;
const int Max = 10010;
struct NODE
{
    int value;    //数值
    int original;  //原来顺序 
    int sorted;   //排序后顺序     
};
NODE a[Max]; 
int cmp1(NODE x, NODE y)  //按数值排序 
{
    return x.value < y.value;
}
 
int cmp2(NODE x, NODE y)  //按原来的输入顺序排序 
{
    return x.original < y.original;
}
 
int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        for(int i=0; i<n; i++) 
        {
            scanf("%d", &a[i].value);
            a[i].original = i;  //保存原来输入的顺序 
        }        
        sort(a, a+n, cmp1);  //按数值排序 
        for(int i=0; i<n; i++)
        {
        	a[i].sorted=i+1;  //排序后的位置从1开始算起 
        }
        sort(a, a+n, cmp2);  //按原来的输入顺序排序 
        for(int i=0; i<n; i++)
        {
        	printf("%d",a[i].sorted); //输出排序后的位置 
			if(i != n-1) 
				printf(" ");
        } 
		printf("\n");           
    }
    return 0;
}


点赞(0)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

万春明 1年前 回复TA
好吃不过饺子,最好不过老师,结构体与数组排序的结合使用,很有拓展性思维。
好想进省一 2年前 回复TA
老师讲的太好了,特别详细,看完恍然大悟,写完后不禁感叹sort排序的cmp自定义函数是如此的强大!!!