前段时间C++老师布置了点思考题,让我们把冒泡排序优化一下。
冒泡排序是个什么玩意呢?大概长下面这样:
排序过程:
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。
(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。
核心代码是这样的:
for(i=1;i<=9;i++)
for(j=0;j<=9-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
优化的意思是:如果我没把循环跑满就已经排序完成了,那么自动退出循环。
这能难得倒我吗?如果她不留这题,我还真不知道我不会……
咳咳,扯远了,老师给出的解答是这样的:
for(i=1;i<=9;i++)
flag=1;
for(j=0;j<=9-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
flag=0;
}
if(flag)
break;
这么改的依据是,如果所有数字都在该在的位置上,那么就不会进入if语句,flag变量就会一直为1,就可以跳出来了……
nb.jpg
这么说这个的确是状态变量的另一个妙用了。
本文介绍了一种冒泡排序算法的优化方法,通过引入状态变量flag,实现提前终止循环,提高排序效率。具体优化思路是在一次遍历中如果没有发生任何交换,则说明数组已排序完成,可立即结束排序。
1448





