余子涵


私信TA

用户名:dotcpp0595408

访问量:1132

签 名:

等  级
排  名 548
经  验 4385
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校 长江大学
专  业 电子信息工程

  自我简介:

TA的其他文章

解题思路:
首先回顾一下题目的输入格式与输出格式要求

输入:输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

输出:对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。


首先要确定代码的输入是一个整数n,再接着n个不相同的整数;另外这里题目并没有对测试用例的数量进行说明,所以要清楚这里要用while循环(或者do while循环);接着就是数据的处理部分,就是单纯的从大到小排序,但是要注意是对每个整数的绝对值进行比较;最后的输出,就是排好序的n个整数。


注意事项:

1.一般在输入阶段,如果题目没有给出具体的测试数量,或者通过计算无法得出具体的处理次数,在代码中,对应则是while循环,而针对OJ的黑盒测试,测试的样本并不是无限数量的,所以应该考虑接收的输入可能到达文件末尾的情况,否则会导致输出超限。

2.在排序时,不应该只考虑整个循环结束后是否能够排好序,而也应该考虑有可能在循环结束之前就已经排好序了,所以应该加入一个标识位,来监测数组的排序状态,当排序一结束,就立马跳出循环,这样处理,对于大数据量的排序,可以达到明显的降低算法时间复杂度的效果。

3.对于题目的输出,可以有两种理解,第一种是对于一个测试用例就输出一次排序结果;第二种是对于所有的测试用例,最后一起输出排序的结果。个人认为第一种处理会使代码更加简单,同时这样处理也更加直观。


参考代码:

#include#includeint main()
{
	int n, i, j, flag, temp;
	while(scanf("%d", &n) != EOF && n != 0)
	{
		int x[n];
		for(i = 0; i < n; i++)
		{
			scanf("%d", &x[i]);
		}
		for(i = 1; i < n; i++)
		{
			flag = 1;
			for(j = 0; j < n - i; j++)
			{
				if(abs(x[j]) < abs(x[j+1]))
				{
					temp = x[j];
					x[j] = x[j + 1];
					x[j + 1] = temp;
					flag = 0;
				}
			}
			if(flag)
			{
				break;
			}
		}
		for(i = 0; i < n - 1; i++)
		{
			printf("%d ", x[i]);
		}
		printf("%d\n", x[i]);
	}
	return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »