Description
用函数实现冒泡排序,并输出每趟排序的结果(要求当一趟冒泡过程中不再有数据交换,则排序结束)输入格式
第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据输出格式
每行输出每趟排序结果,数据之间用一个空格分隔输入样例
10 5 4 8 0 9 3 2 6 7 1输出样例
4 5 0 8 3 2 6 7 1 9 4 0 5 3 2 6 7 1 8 9 0 4 3 2 5 6 1 7 8 9 0 3 2 4 5 1 6 7 8 9 0 2 3 4 1 5 6 7 8 9 0 2 3 1 4 5 6 7 8 9 0 2 1 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
啊,冒泡排序,老熟人了这不是。这几天复习好无聊,就随便写写叭。
假设有n个元素,那么在冒泡排序中我们需要比较n-1趟。
第一趟从第1个元素比较到第n个元素,共比较了n-1次。第一次为第1个和第2个比较,若第1个大于第2个,则它们俩交换位置;第二次为第2个和第3个比较,若第2个大于第3个,则交换位置……第n-1次为第n-1个和第n个比较,这n-1次比下来,这n个元素中最大的数就跑到了第n个位置。
第二趟从第1个元素比较到第n-1个元素,共比较了n-2次。第一次为第1个和第2个比较……第n-2次为第n-2个和第n-1个比较,n-2次比下来,第二大的元素就跑到了第n-1个位置。
以此类推即可。
当然,题目要求当一趟冒泡过程中不再有数据交换,则排序结束,这个也好办,在内层循环里做个flag就好啦。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
using namespace std;
void print(int n,int a[])
{
for(int i=1;i<=n;i++)
cout << a[i] << ' ';
cout << endl;
}
void maopao(int n,int a[])
{
int m,flag,j;
m=n-1,flag=1;
while((m>0) && (flag==1))
{
flag=0;
for(j=1;j<=m;j++)
{
if(a[j]>a[j+1])
{
int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
print(n,a);
}
}
int main()
{
int n,a[100005];
std::ios::sync_with_stdio(false);
cin >> n;
int i;
for(i=1;i<=n;i++)
cin >> a[i];
maopao(n,a);
return 0;
}