冒泡排序——華農oj 8641

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;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章