排序思想
依次比較相鄰的兩個記錄的關鍵字,若兩個記錄是反序的(即前一個記錄的關鍵字大於後前一個記錄的關鍵字),則進行交換,直到沒有反序的記錄爲止。
① 首先將L->R[0]與L->R[0]的關鍵字進行比較,若爲反序(L->R[0]的關鍵字大於L->R[1]的關鍵字),則交換兩個記錄;然後比較L->R[1]與L->R[2]的關鍵字,依此類推,直到L->R[n-2]與L->R[n-1]的關鍵字比較後爲止,稱爲一趟冒泡排序,L->R[n-1]爲關鍵字最大的記錄。
② 然後進行第二趟冒泡排序,對前n-1個記錄進行同樣的操作。
一般地,第i趟冒泡排序是對L->R[1 … n-i+1]中的記錄進行的,因此,若待排序的記錄有n個,則要經過n-1趟冒泡排序才能使所有的記錄有序。
排序示例
設有9個待排序的記錄,關鍵字分別爲23, 38, 22, 45, 23, 67, 31, 15, 41,冒泡排序的過程如圖1所示。
算法實現
#define FALSE 0
#define TRUE 1
void Bubble_Sort(int value[], int length)
{
int i, j, flag;
int tmp = 0;
for(i=0; i<length; i++) /* 共有n-1趟排序 */
{
flag = TRUE;
for(j=1; j<length - i; j++) /* 一趟排序 */
if(value[j-1] < value[j])
{
flag = FALSE;
tmp = value[j];
value[j] = value[j-1];
value[j-1] = tmp;
}
if(flag == TRUE)
break;
}
}
算法分析
時間複雜度
◆ 最好情況(正序):比較次數:n-1;移動次數:0;
◆ 最壞情況(逆序):
比較次數:
移動次數:
故時間複雜度:T(n) = O(n²)
空間複雜度:S(n) = O(1)