题目描述
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
输入格式
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行
样例输入
3 3 -4 2 4 0 1 2 -3 0
样例输出
-4 3 2 -3 2 1 0
代码分析
1. 引入头文件
代码首先引入了stdio.h
和math.h
头文件。stdio.h
用于标准输入输出,math.h
提供了数学函数fabs
,用于计算浮点数的绝对值。
2. 主函数定义
main
函数是程序的入口点,它没有接收任何参数,也没有返回值。
3. 定义变量
在main
函数内部,定义了以下变量:
int n;
:用于存储每个数组的长度。int arr[1000];
:一个整型数组,用于存储输入的整数,数组大小为1000,意味着最多可以存储1000个整数。
4. 输入循环
使用一个while
循环来不断读取输入,直到遇到文件结束符EOF
或输入的数字为0:
scanf("%d", &n);
:使用scanf
函数读取一个整数,代表接下来要输入的数组长度。
5. 读取数组元素
如果n
不为0,则使用一个for
循环读取n
个整数到数组arr
中。
6. 冒泡排序逻辑
使用两层嵌套的for
循环来实现冒泡排序:
- 外层
for
循环变量i
控制排序的总轮数,这里需要进行n-1
轮比较。 - 内层
for
循环变量j
进行相邻元素的比较,使用fabs
函数比较绝对值,以实现按照绝对值从小到大的排序。
在内层循环中:
- 如果
arr[j]
的绝对值小于arr[j + 1]
的绝对值,则交换这两个元素的位置,并设置p
为1,表示发生了交换。
7. 优化:提前结束排序
如果在某一轮遍历中没有发生任何交换(即p
保持为0),则说明数组已经按照绝对值排好序,可以提前结束排序。
8. 输出排序结果
使用一个for
循环遍历排序后的数组,并使用printf
函数输出每个元素。
9. 循环继续条件
while
循环的条件检查scanf
的返回值和n
是否为0,如果不是,则继续循环。
10. 程序结束
main
函数返回0,表示程序正常结束。
源代码
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
int arr[1000];
while (scanf("%d", &n) != EOF && n != 0)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 0; i < n-1; i++)
{
int p = 0;
for (int j = 0; j < n - 1; j++)
{
int temp;
if (fabs(arr[j]) < fabs(arr[j + 1]))
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
p = 1;
}
}
if (p == 0)
break;
}
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
return 0;
}