对于类似于(3,2,1,5,6,7)的序列,可以看出这个序列的后缀是已经有序的,所以在前一趟扫描后发现后缀有序,在下一次扫描时就忽略有序的后缀,而不是仅仅长度减一,这样就能避免无谓的扫描。
代码如下:
int bubble(int vec[], int lo, int hi);
void bubbleSort(int vec[], int lo, int hi)
{
while(lo + 1 < (hi = bubble(vec, lo, hi)));
}
int bubble(int vec[], int lo, int hi)
{
int last, tmp;
while(++lo < hi)
{
if(vec[lo] < vec[lo-1])
{
tmp = vec[lo];
vec[lo] = vec[lo-1];
vec[lo-1] = tmp;
last = lo;
}
}
return last;
}