在前篇的選擇排序中,n個數據最多進行n-1次交換,但每次交換前要進行大量比較操做來肯定交換對象,比較次數遠大於交換次數。而交換操做只是數據的讀寫,數據規模較小時,其工做量比比較工做量小。用增長交換的次數來減小比較次數有多是合理的,因此冒泡排序的好處是以交換爲主要手段。若是排序對象基本有序時,冒泡排序算法將具備較高的效率。這是由於冒泡排序中有個標誌變量是用於提早終止排序的,也即排序能夠半途終止。算法
下面的代碼進行了冒泡排序的練習。code
#include <stdio.h> #define MAXSIZE 50 void Bubble_sort(int *s, int n); int main(void) { int n, i; int s[MAXSIZE + 1]; printf("冒泡排序練習\n"); printf("輸入排序數據個數:"); scanf("%d", &n); getchar(); printf("依次輸入數據\n"); for(i=1; i<=n; i++) scanf("%d", &s[i]); Bubble_sort(s, n); printf("排序後的數據爲\n"); for(i=1; i<=n; i++) printf("%d ", s[i]); printf("\n"); return 0; } void Bubble_sort(int *s, int n) { int i, j, k; int flag = 0; //交換標誌變量 for(i=1; i<=n; i++) { flag = 1; for(j=n; j>i; j--) //從後向前查找最小值 { if(s[j] < s[j-1]) { s[0] = s[j]; s[j] = s[j-1]; s[j-1] = s[0]; flag = 0; } } if(flag) //已經有序,提早終止排序 break; } }
其算法操做有兩部分,一種是比較操做,一種是交換操做。冒泡排序能夠進行靜態排序,但效率不高。也能夠動態排序,但工做量比插入算法大一些(交換次數多一些)。最適合半動態排序,即每生成若干數據排序一次。對象
該算法須要的資源也比較少,只須要一個備用單元和3個輔助變量。排序