七種排序--------冒泡排序(Bubble Sort)

冒泡排序是一種交換排序,他的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止。

首先做一下排序前的準備工作,看如下代碼:

#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);

發佈了26 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章