【筆記】氣泡排序

Time-space發表於2017-11-05

  氣泡排序是最簡單的交換排序方法。

  基本演算法思想:首先將第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序(L.r[1].key>L.r[2].key

L.r[1].key>L.r[2].key
),則將兩個記錄交換之,然後比較第二個記錄和第三個記錄的關鍵字。依此類推,直至第n-1個記錄和第n個記錄的關鍵字進行過比較為止。上述過程稱為第一趟冒泡過程,其結果使得關鍵字最大的記錄被安置到最後一個記錄的位置上。然後進行第二趟氣泡排序,對前n-1個記錄進行同樣操作,其結果是使關鍵字次大的記錄被安置到第n-1個記錄的位置上。一般地,第i趟氣泡排序是從L.r[1]
L.r[1]
L.r[ni+1]
L.r[n-i+1]
依次比較相鄰李娜改革記錄的關鍵字,並在“逆序”時交換相鄰記錄,其結果是這n-i+1個記錄中關鍵字最大的記錄被交換到第n-i+1的位置上。

  整個排序過程需進行k(1k<n

1 \leq k <n
)趟氣泡排序,顯然判別氣泡排序結束的條件應該是在一趟排序過程中沒有進行過交換記錄的操作。右下圖可見,在氣泡排序的過程中,關鍵字較小的記錄好比水中氣泡逐趟向上漂浮,而關鍵字較大的記錄好比石塊往下沉,每一趟有一塊“最大”的石頭沉到水底。


這裡寫圖片描述

  • 實現原始碼
 #define TRUE 1
 #define FALSE 0
 #define N 8
 typedef int Status;
 void bubble_sort(int a[],int n)
 { /* 將a中整數序列重新排列成自小至大有序的整數序列 */
   int i,j,t;
   Status change;
   for(i=n-1,change=TRUE;i>1&&change;--i)
   {
     change=FALSE;
     for(j=0;j<i;++j)
       if(a[j]>a[j+1])
       {
         t=a[j];
         a[j]=a[j+1];
         a[j+1]=t;
         change=TRUE;
       }
   }
 }

 void print(int r[],int n)
 {
   int i;
   for(i=0;i<n;i++)
     printf("%d ",r[i]);
   printf("\n");
 }

 void main()
 {
   int d[N]={49,38,65,97,76,13,27,49};
   printf("排序前:\n");
   print(d,N);
   bubble_sort(d,N);
   printf("排序後:\n");
   print(d,N);
 }
  • 測試結果

    這裡寫圖片描述

相關文章