故事引入
小竞有一堆乱序的数字卡片,他想按照从小到大的顺序排好。他决定用“冒泡排序”的方法:
每一轮,他从左到右比较相邻的两张卡片,如果左边比右边大,就把它们交换位置。这样,每一轮结束后,最大的数字就会像气泡一样“浮”到最右边。
如果某一轮没有任何交换发生,说明卡片已经全部排好序,就可以提前结束啦!
你的任务
输入 n 个整数,请你用冒泡排序的方法,把它们按从小到大(升序)排列。
在排序过程中,你需要输出每一轮结束后的数组状态(也就是每一轮比较完后的结果),但只输出发生了交换的轮次。如果某一轮没有发生任何交换,就直接结束排序(不再继续后面的轮次,也不输出这一轮的结果)。
最后,输出最终的排序结果。
输入格式
- 第一行:一个整数
n,表示数字的个数(1 ≤ n ≤ 1000)。 - 第二行:
n个整数,用空格隔开。
输出格式
- 第一行:先输出
Initial:,然后输出初始的数组,数字之间用空格隔开。 - 接下来的若干行:每一轮结束后,如果这一轮中至少发生了一次交换,就输出
Round X:(X 是第几轮,从 1 开始),然后输出这一轮结束后的数组状态,数字之间用空格隔开。 - 最后一行:输出
Sorted array:,然后输出最终排好序的数组,数字之间用空格隔开。
注意:
- 如果某一轮没有发生任何交换,那么这一轮不输出,并且整个排序过程立刻停止(不再继续后面的轮次)。
- 请严格按照样例的格式输出,包括冒号、空格等。
样例输入
5
5 3 8 1 2
样例输出
Initial: 5 3 8 1 2
Round 1: 3 5 1 2 8
Round 2: 3 1 2 5 8
Round 3: 1 2 3 5 8
Sorted array: 1 2 3 5 8
样例解释(逐步讲解)
初始数组:5 3 8 1 2
-
第 1 轮(比较 4 次,把最大的 8 移到最右边):
- 比较 5 和 3 → 5 > 3,交换 → 数组变成
3 5 8 1 2 - 比较 5 和 8 → 5 < 8,不交换 →
3 5 8 1 2 - 比较 8 和 1 → 8 > 1,交换 →
3 5 1 8 2 - 比较 8 和 2 → 8 > 2,交换 →
3 5 1 2 8
第 1 轮发生了交换,所以输出 Round 1: 3 5 1 2 8
- 比较 5 和 3 → 5 > 3,交换 → 数组变成
-
第 2 轮(比较前 4 个数,把剩下的最大数 5 移到倒数第 2 位):
- 比较 3 和 5 → 3 < 5,不交换 →
3 5 1 2 8 - 比较 5 和 1 → 5 > 1,交换 →
3 1 5 2 8 - 比较 5 和 2 → 5 > 2,交换 →
3 1 2 5 8
第 2 轮发生了交换,输出 Round 2: 3 1 2 5 8
- 比较 3 和 5 → 3 < 5,不交换 →
-
第 3 轮(比较前 3 个数):
- 比较 3 和 1 → 3 > 1,交换 →
1 3 2 5 8 - 比较 3 和 2 → 3 > 2,交换 →
1 2 3 5 8
第 3 轮发生了交换,输出 Round 3: 1 2 3 5 8
- 比较 3 和 1 → 3 > 1,交换 →
-
第 4 轮(理论上应该比较前 2 个数): 比较 1 和 2 → 1 < 2,不交换 → 这一轮没有任何交换,所以直接结束排序,不输出第 4 轮。
-
最后数组已经排好序:
1 2 3 5 8,输出 Sorted array: 1 2 3 5 8
重要提示
- 你必须自己编写冒泡排序。
- 记得使用优化标志(比如一个 bool 变量
swapped),如果某一轮没有交换,就提前结束。 - 输出时注意空格和标点符号,要和样例完全一致。
冒泡排序是排序算法里最形象的算法之一,就像杯子里的小气泡慢慢上浮。