首先我们来看看正宗的冒泡排序,实际上就是有缺点的金典冒泡。
void BubbleSort(SqList *L) {
int i,j;
for(i = 1;i<L->length;i++) {
for(j = L->length-1;j>=i;j--) { // 注意:j是从后往前循环
if(L->r[j] > L->[j+1]) {
swap(L,j,j+1); // 交换L->r[j] 和 L->r[j+1]
} // Of if
} // Of for j
} // Of for i
} // Of BubbleSort
较小的数字如同冒泡一样慢慢浮到上面,因此得名冒泡算法。可是要是数据是这样{2,1,3,4,5,6,7,8,9}只有前面两个数字乱的,后面都排好了,你这样再从最后一个比较,就很傻对不对?所以我们需要改进代码,增加一个标记量flag来实现算法的改进。
void BubbleSort(SqList *L) {
int i,j;
Status flag = TRUE; // flag 用来作为标记
for(i = 1;i < L->length && flag;i++) {
flag = FALSE; //初始为false
for(j = L->length-1;j>=i;j--) { // 注意:j是从后往前循环
if(L->r[j] > L->[j+1]) {
swap(L,j,j+1); // 交换L->r[j] 和 L->r[j+1]
flag = TRUE; // 如果有交换,flag 为true
} // Of if
} // Of for j
} // Of for i
} // Of BubbleSort
也就是我们立一个flag,如果一次循环有比较,那么下一次可能会比较。如果从低到向上都没有比较,说明以后顺序都排好了,不用循环了。