题目描述
将十个数进行从大到小的顺序进行排列
输入格式
十个整数
输出格式
以从大到小的顺序输出这个十个数
样例输入
1 2 3 4 5 6 7 8 9 10
样例输出
10 9 8 7 6 5 4 3 2 1
代码解析
1. 引入头文件
代码首先引入了stdio.h
头文件,这是C语言标准输入输出库,用于处理输入输出函数。
2. 主函数定义
main
函数是程序的入口点,它没有接收任何参数,也没有返回值。
3. 定义数组和变量
在main
函数内部,定义了以下变量:
int arr[10];
:一个整型数组,用于存储用户输入的10个整数。int temp;
:一个整型变量,用于在排序过程中交换元素。int p = 0;
:一个标志变量,用于跟踪每次遍历是否发生了元素交换。
4. 输入循环
使用一个for
循环来读取用户输入的10个整数:
scanf("%d", &arr[i]);
:使用scanf
函数读取一个整数,并将其存储在arr[i]
中。
5. 冒泡排序逻辑
使用两层嵌套的for
循环来实现冒泡排序,外层循环控制排序的总轮数,内层循环进行相邻元素的比较和交换:
- 外层
for
循环变量i
从0到8,表示需要进行9轮比较。 - 内层
for
循环变量j
从0到8,但在每轮比较中,只比较到第9-i
个元素,因为后面的元素已经在前面的轮次中排好序了。 - 如果
arr[j]
小于arr[j + 1]
,则交换这两个元素,并设置p
为1,表示发生了交换。
6. 优化:提前结束排序
如果在某一轮遍历中没有发生任何交换(即p
保持为0),则说明数组已经排好序,可以提前结束排序。
7. 输出排序结果
使用一个for
循环遍历排序后的数组,并使用printf
函数输出每个元素。
8. 程序结束
main
函数返回0,表示程序正常结束。
源代码
#include <stdio.h>
int main(void)
{
int arr[10];
int temp;
int p = 0;//用于遍历一次是否发生交换
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 0; i < 9; i++)
{
p = 0;
for (int j = 0; j < 9; j++)
{
if (arr[j] < 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 < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}