冒泡排序是一種交換排序,他的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止。
首先做一下排序前的準備工作,看如下代碼:
#define MAXSIZE 10 //用於排序數組個數的最大值,
typedef struct
{
int r[MAXSIZE];
int length; //數組長度
}SqList;
void swap(SqList *L,int i,int j) //交換L中數組r的下標i和j的值
{
int tmp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = tmp;
}
來看一段比較容易理解的冒泡排序代碼:
void BubbleSort(SqList *L)
{
int i,j;
for(i = 0;i < L->length;i++)
{
for(j = i + 1;j <= L->length;j++)
if(L->r[i] > L->r[j])
swap(L,i,j);
}
}
這段代碼嚴格意義上來說,不算是標準的冒泡排序算法,他只能算是最簡單的交換排序而已。他的就是讓每一個關鍵字都和他後面的一個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次循環後一定變成了最小值,經過length - 1次循環後便完成了排序。
下面看一下真正的冒泡排序算法:
void BubbleSort(SqList *L)
{
int i,j;
for(i = 0;i < L->length;i++) //注意j是從後往前循環
{
for(j = L->length-1;j > i;j--)
{
if(L->r[j] > L->r[j - 1]) //若前者大於後者(注意這裏與上一個算法的差異)
swap(L,j,j - 1);
}
}
}
假設我們待排序的關鍵字序列是{9,1,5,8,3,7,4,6,2},當 i = 0 時,變量 j 由 8 反向循環到 1 ,逐個比較,將較小值jiao交換到前面,知道最後找到最小值放在了第一的位置,如此往復。在不斷循環的過程中,除了將關鍵字1 放在了第一的位置,還將關鍵字 2 從第九的位置放到了第三的位置,顯然這一算法比前面的好一些,當shu數據比較多的時候,這種差異就會體現出來。較小的數字就像氣泡般浮到上面,因此這種排序被命名爲冒泡排序。
冒泡排序優化:
如果待排序的序列爲{2,1,3,4,5,6,7,8,9},也就是說,除了第一第二的關鍵字需要交換以外,別的已經不需要排序了,如果還遍歷的話就會比較浪費時間。對此,可以設置一個flag進行判斷,具體代碼如下:
void BubbleSort(SqList *L)
{
int i,j;
int flag = true; //用flag來標記
for(i = 0;i < L->length && flag;i++) //若flag爲false則退出循環
{
flag = false;
for(j = L->length-1;j > i;j--)
{
if(L->r[j] > L->r[j - 1])
{
swap(L,j,j - 1);
flag = true; //若有數據交換,則flag爲true
}
}
}
}
其時間複雜度爲O(n*n);