10.3.1 起泡排序

  在算法10.7中,经过每一趟起泡,待排记录序列的上界 i 都只是减1。但实际上,有的时候起泡的上界可以缩减不止1个记录的位置,例如右侧所示例子。

  从这个例子可见,在一趟起泡的过程中,有可能只是在区段的前端进行记录的交换,而其后端记录已经按关键字有序排列,由此应在算法中设置一个指示"最后一个进行交换的记录的位置"的变量。改进后的起泡算法如下:

算法 10.8
  void BubbleSort( SqList &L )
 {
  // 对顺序表L作起泡排序
  i = L.length;
  while (i >1) {          // i>1 表明上一趟曾进行过记录的交换
   lastExchangeIndex = 1;
   for (j = 1; j < i; j++){
    if (L.r[j+1].key < L.r[j].key) {
     L.r[j] ←→.r[j+1];    // 互换记录
     lastExchangeIndex = j;   // 记下进行交换的记录的位置
    } // if
   } // for
   i = lastExchangeIndex;
            // 一趟起泡后仍处于无序状态的最后一个记录的位置
  } // while
 } // BubbleSort
 

动画