解题思路:
认真看题目,不仅仅是简单的排序而已哦。
输出是:各输入的值按从小到大排列的次序。
例如:
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分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复