Hzu挑战自我


私信TA

用户名:gxhzxyjsj

访问量:98760

签 名:

2024终究会过去,期待2025!

等  级
排  名 8
经  验 27853
参赛次数 67
文章发表 157
年  龄 0
在职情况 教师
学  校 贺州学院
专  业 软件工程

  自我简介:

弱鸡一个,继续努力!

解题思路: 

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


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

例如:

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 人评分

  评论区

好吃不过饺子,最好不过老师,结构体与数组排序的结合使用,很有拓展性思维。
2023-03-23 20:59:58
老师讲的太好了,特别详细,看完恍然大悟,写完后不禁感叹sort排序的cmp自定义函数是如此的强大!!!
2022-07-27 21:54:07
  • «
  • 1
  • »