|
算法 10.7 void BubbleSort(SqList &L)
{ //
对顺序表L作起泡排序 for (i=L.length, change=TRUE; i>1 &&
change; --i) { change = FALSE; for (j=1; j<i; ++j)
if (L.r[j].key > L.r[j+1].key) { L.r[j]←→L.r[j+1];
change = TRUE } }//
for i } // BubbleSort
分析起泡排序的时间复杂度:和直接插入相似,排序过程中所进行的"比较" 和 "移动" 操作的次数取决于待排记录序列的状态,在待排记录处于"正序"时取最小值,此时只需进行一趟起泡排序,反之,在待排记录处于"逆序"时取最大值,此时需进行
n-1趟起泡,列表如下:
待排记录状态 |
"比较"次数 |
"移动"次数 | 正序 |
n-1 | 0 |
逆序 |
|
|
| | 算法中设立了一个标志一趟起泡中是否进行了交换记录操作的布尔型变量change,在每一趟起泡之前均将它设为"FALSE",一旦进行记录交换,则将它改为"TRUE",因此
change=TRUE 是进行下一趟起泡的必要条件。 当待排序列中的记录已按关键字有序排列时,显然,在进行n-1次关键字的比较,而不需要交换记录;然而,当待排序列中的记录按关键字逆序排列时,需进行
n-1 趟起泡,并且每一趟起泡都需进行所有记录的互换,因此进行的关键字比较的总数为: ,
进行的记录移动的总数为: 。 | |