C语言题目:绝对值排序(冒泡排序)

题目描述

输入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.hmath.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;
}

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值