PS:答题思路为本人对此题解法的思考。
题目
本题目要求读入N个整数,采用冒泡排序(上升法,即每轮得到一个最小值)进行排序,输出前3轮排序后的结果。
输入格式:
输入不超过100的正整数N和N个整数(空格分隔)。
输出格式:
输出三行,第一行为第一轮排序结果,第二行为第二轮排序结果,第三行为第三轮排序结果。数据间用一个空格分隔。
为简便起见,最后一个元素后也有一个空格。
输入样例:
5
2 5 4 1 3
输出样例:
1 2 5 4 3
1 2 3 5 4
1 2 3 4 5
图(非本题目要求,而是每轮在数组的最后得到一个最大值)
第一轮图

从a[0]和a[1]开始比较,没有逆序,不交换。

a[1]和a[2]比较

逆序,交换

a[2]和a[3]比较

逆序,交换

a[3]和a[4]比较

逆序,交换

第一轮结束,得到结果为最大值排到数组最后位置

答题思路
参考上面流程,由“采用冒泡排序(上升法,即每轮得到一个最小值)进行排序”可知
- 数组从后往前到第一个位置比较相邻的两个元素;
- 若逆序(即前者大于后者),则将两元素交换。即每次比较完都会得到前者小与后者的结果。
- 第一轮排序结束后,数组中最小的元素已被交换到首位。
- 再从数组最后往前到第二个位置重复1-3的操作,直到排到倒数第二个位置。此时排除了已在前面排好序的最小元素,得到第二小元素
- 以此类推,最后数组的值从小到大排列。

代码
#include<stdio.h>
int main(){
int n;
int a[100];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<3;i++)
{
for(int j=n-1;j>i;j--)
{
if(a[j-1]>a[j])
{
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
for(int k=0;k<n;k++)
{
printf("%d ",a[k]);
}
printf("\n");
}
return 0;
}
输入:

输出:
