解题思路:
认真看题目,不仅仅是简单的排序而已哦。
输出是:各输入的值按从小到大排列的次序。
例如:
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 人评分
点我有惊喜!你懂得!浏览:2071 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:763 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:538 |
C语言训练-求PI* (C语言代码)浏览:613 |
C语言训练-尼科彻斯定理 (C语言代码)浏览:463 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:331 |
WU-printf基础练习2 (C++代码)浏览:1999 |
C语言程序设计教程(第三版)课后习题6.5 (C++代码)浏览:447 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:703 |
1113题解浏览:784 |