解题思路:
认真看题目,不仅仅是简单的排序而已哦。
输出是:各输入的值按从小到大排列的次序。
例如:
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语言代码)浏览:1652 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:1273 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:1175 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:643 |
简单的a+b (C++语言代码)浏览:895 |
用筛法求之N内的素数。 (C语言代码)浏览:1385 |
A+B for Input-Output Practice (III) (C语言代码)浏览:592 |
wu-理财计划 (C++代码)浏览:907 |
1025题解浏览:796 |
C二级辅导-温度转换 (C语言代码)浏览:802 |