8641 冒泡排序
時間限制:1000MS 代碼長度限制:10KB
提交次數:3093 通過次數:1361
題型: 編程題 語言: G++;GCC
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
#include<stdio.h>
#define maxn 10000
//假設數組元素不超過10000個
int a[maxn];
/*
冒泡排序的原理:
剛開始所有的數都是無序的,通過冒泡操作使得無序數中最大的或者最小的一個數排到正確位置。
然後無序數就減一,然後再在剩餘的無序數中經過冒泡操作繼續使得一個數排好。不斷排序,直到排好序。
優化,若無序區未排好,則冒泡操作必然會有交換操作。
*/
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&a[i]);
//下面舉一個例子,實際上冒泡排序是由內往外寫的
for(i=n-1;i>=0;i--){ //開始全部無序,每經過一輪,無序區最後一個變爲有序
int pand=0; //判斷有沒有交換
for(j=0;j<i;j++) //冒泡操作,i爲無序區的最後一個元素。
{
if(a[j]>a[j+1]) //交換操作
{
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
pand=1;
}
}
for(k=0;k<n;k++)printf("%d ",a[k]);
printf("\n");
if(pand==0)break;
}
return 0;
}