【ACM题】排序问题

来源:互联网 发布:千千自动发卡源码 编辑:程序博客网 时间:2024/05/30 04:06

1.问题描述:

Problem Description

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

Input

输入数据有一行,包含10个整数,用空格分开。

Output

输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。

Example Input

1 2 3 5 4 6 8 9 10 7

Example Output

1 2 3 4 5 6 7 8 9 101 2 3 5 4 6 10 7 8 9

2.题目评价:

这是个数组题,但正好自己在学习结构,看到该题想到可以通过结构来解决,加上用到刚刚学习的冒泡算法,这几个相结合等于实践了一遍自己所学习的知识,挺不错的。因为结构和冒泡算法其实是自己第一次写,所以这设计起来的时候比较难,查了很多东西,但幸好最后代码仅改了一次就通过了,万幸,本以为是一个废代码又得重新构思编写。。。

3.题目思路:
①设计结构,一个结构存放其值,另一个结构存放录入时的序号。
②申请该结构的一个数组,数组个数为11。
③依次输入赋值。

④通过冒牌排序,判断每个元素的value值,实现交换,注意交换中其序号和值都要交换,但数组序号是不变的。

⑤先依次输出结构数组中的每个value值,换行再重新输出结构数组中的每个lab值。


4.注意事项:

①明确结构定义方法,一般在头文件部分定义结构;其中是定义结构而不是定义结构数组,结构数组是在函数内使用到申请的,逻辑要理清。

②冒泡排序,外循环是定义次数,内循环变量表示其数组序号,其中,因为外循环一次,其数组最后的值都变为最大,所以内循环每次循环结束的部分都要减小。

③明确lab表示的是value对应的序号,与数组的序号不是一个概念,交换时lab也要完成交换。


5.通过代码:

#include <stdio.h>struct s{                    //定义结构int value;           //值
int lab;             //当该值输入的时候所对应的序号};int main(){struct s num[11];   //申请结构数组numfor(int i=1;i<=10;i++)   //对num[]中的每个元素的value,lab进行赋值{num[i].lab=i;scanf("%d",&num[i].value);}int t;for(int i=1;i<=9;i++)//使用冒泡排序从小到大进行排序{for(int j=1;j<=10-i;j++){if(num[j].value>num[j+1].value)  //应该注意交换时将value和lab都要进行交换。{ t=num[j].value;num[j].value=num[j+1].value;num[j+1].value=t; t=num[j].lab;num[j].lab=num[j+1].lab;num[j+1].lab=t;} }}for(int i=1;i<=10;i++)  //一行输出值{printf("%d",num[i].value);if(i==10) printf("\n");else printf(" ");}for(int i=1;i<=10;i++) //另一行输出值当时输入时的序号,程序完毕。{printf("%d",num[i].lab);if(i==10) printf("\n");else printf(" ");}return 0;}

6.后记:

在设计该程序时,思考在交换结构数组时这样每个成员都单独进行交换其实是个很麻烦的事情,尝试可以把交换元素t定义为相同的结构,可以直接进行结构之间而非成员之间进行交换,或者采用指针(搜资料时翻到的,没深究..),留个坑在这里,之后随着结构的学习会把它填上。

原创粉丝点击