一、概念
冒泡排序(Bubble Sort):一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止。
二、排序用到的結構與函數
#define MAXSIZE 10 /*用於要排序數組個數最大值,可根據需要修改*/ typedef struct { int r[MAXSIZE+1]; /*用於存儲要排序數組,r[0]用作哨兵或臨時變量*/ int length; /*用於記錄順序表的長度*/ }SqList; /*交換L中數組r的下標爲i和j的值*/ void swap(SqList *L ,int i,int j) { int temp=L->r[i]; L->r[i]=L->r[j]; L->r[j]=temp; }
三、不同級別的冒泡排序
1、冒泡排序初級版
/*對順序表L作交換排序*/ void BubbleSort0(SqList *L) { int i,j; for(i=1;i<L->length;i++) { for(j=i+1;j<=L->length;j++) { if(L->r[i]>L->r[j]) swap(L,i,j); /*交換L->[i]與L->r[j]的值*/ } } }
說明:這個算法總是把此低的數據換到靠後的位置,算法效率非常低。
2、冒泡排序
/*對順序表L作冒泡排序*/ void BubbleSort(SqList *L) { int i,j; for(i=1;i<L->length;i++) { for(j=L->length-1;j>=i;j--) /*注意j是從後往前循環*/ { if(L->r[j]>L->r[j+1]) /*若前者大於後者(注意這裏與上一算法差異)*/ swap(L,j,j+1); /*交換L->r[j]和L->r[j+1]的值*/ } } }
說明:這個算法有一個缺點,當給出的整個順序表已經是有序的,但是代碼還是要一一比較
3、冒泡排序優化版
/*對順序表L作改進冒泡算法*/ void BubbleSort2(SqList *L) { int i,j; Status flag=TRUE; /*flag用來作爲標記*/ for(i=1;i<L->length && flag;i++) /*若flag爲false則退出循環*/ { flag=FALSE; /*初始爲false*/ for(j=L->length-1;j>=i;j--) { if(L->r[j]>L->r[j+1]) { swap(L,j,j+1); /*交換L->r[j]與L->r[j+1]的值*/ /*在這個大循環中如果有數據循環false=true,若是沒有,說明整個表已是有序的了,不需要再循環比較了*/ false=TRUE; } } } }