|
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 |
|
|
|