众所周知,基本的冒泡排序如下所示
for(int i = 0;i<n-1;i++)//排序完成的数量
{
for(int j = 0 ;j<n-i-1;j++)//排序完成i个的情况下,每层比较次数
{
if(a[j]>a[j+1])
{
Swap(a[j],a[j+1]);
}
}
}
但是,对于 4 1 2 3这样的序列,在完成一次第二层循环时,序列已经有序,但是,函数还是在执行循环判断,所以我们加一个标志,来表示本次第二层循环是不是交换了元素,如果没交换,我们就终止循环。
bool flag = true;
while(flag) {
flag = false;
for(int i = 0; i < n-1; i++) {
if(a[i] > a[i+1]) {
Swap(a[i],a[i+1]);
flag = true;
}
}
n--;
}
还是但是,对于 2 3 1 4 5 6 7 8 9 这样的,只有前边的部分元素无序,而后边的元素有序且大于前边元素的序列,我们需要执行三次while循环,每次需要遍历整个序列,是不是很耗时间呢?所以我们用一个标志来表示本轮最后一个交换的位置,下一轮只需要遍历到标志就行了。
void bubblesort(int *a,int n)
{
int flag = n;
while(flag>0)
{
int key = 0;
for(int i = 0;i<flag-1;i++)
{
if(a[i]>a[i+1])
{
Swap(a[i],a[i+1]);
key = i+1;
}
}
flag = key;
}
}