本题目要求读入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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
分析
本题目是要求采用上升法,每轮排序后得到一个最小值,最终完成升序排序。
而在我之前写过的一道升序冒泡排序文章里,那个题目要求是每轮排序后得到一个最大值。
这两道题的区别就在于每轮得到的最值。如果要得到最大值,我们可以利用 for(int j=0;j<N-i-1;j++); 从左向右排序,每轮排序后,下轮排序最大元素的位置向左移动一位。
而如果要得到最小值。则反过来思考,利用for(int j=N;j>i;j--);从右向左排序;每轮 i 的位置就是此轮循环最小元素的位置。
可以结合我写过的这篇文章对比来分析。升序冒泡排序例题
#include<iostream>
#include<algorithm>
#define MAXSIZE 105
using namespace std;
void Bubble_Sort(int a[], int N)
{
bool flag = 0;
//定义一个排序发生标志 bool量flag
for (int i = 0; i < N - 1; i++) //冒泡排序循环次数是N-1次,此循环记录总循环次数,以及每轮循环排序后首个元素
{
flag = 0;
//每轮循环开始前,flag置0
for(int j=N-1;j>i;j--) //注意a[N]最后一个元素是a[N-1]
if (a[j] < a[j-1])
{
swap(a[j], a[j-1]);
flag = 1;
//如果在此轮循环中发生了元素的交换,则flag=1
}
if (flag) //发生元素交换才输出此次排序过程
{
for (int i = 0; i < N; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
}
}
int main()
{
int N;
cin >> N;
int arr[MAXSIZE];
for (int i = 0; i < N; i++)
cin >> arr[i];
Bubble_Sort(arr, N);
return 0;
}