void BidBubbleSort(int array[], int n)
{
int low, high, flag, i;
low = 0;
high = n - 1;
while (low < high)
{
flag = 0;//假设为0时为有序
for (i = low; i < high; i++) //正向冒泡
{
if (array[i] > array[i + 1]) //找到剩下中最大的
{
Swap(&array[i], &array[i + 1]);
flag = 1; //标志, 有数据交换
}
}
if (!flag)//若数组本身就有序时即上述代码不执行时 !flag=1(成真赋值) 即认定有序不再继续执行
break;
// return;
high--;
for (i = high; i > low; i--) //反向冒泡
{
if (array[i] < array[i - 1]) //找到剩下中最小的
Swap(&array[i], &array[i - 1]);
}
low++;
}
}
在这段代码中,if (!flag) break;
的含义是:
flag
是一个标志,用来表示在当前一轮的正向冒泡过程中是否进行了数据交换。- 如果在当前一轮正向冒泡中没有进行任何数据交换,那么说明数组已经是有序的了,此时就不需要再进行后续的排序了,可以直接跳出循环。
- 因此,
if (!flag) break;
的作用是在正向冒泡过程中检查是否需要继续排序,如果不需要,则直接跳出循环,结束排序过程。
因此,将if (!flag) break;
放在函数中间是为了在正向冒泡和反向冒泡之间进行判断,如果在正向冒泡中已经确定数组有序,则可以直接跳出循环,无需继续执行后续的反向冒泡过程。
flag
是一个标志,用来表示在当前一轮的正向冒泡过程中是否进行了数据交换。- 如果在当前一轮正向冒泡中没有进行任何数据交换,那么说明数组已经是有序的了,此时就不需要再进行后续的排序了,可以直接跳出循环。
- 因此,
if (!flag) break;
的作用是在正向冒泡过程中检查是否需要继续排序,如果不需要,则直接跳出循环,结束排序过程。 在这个函数中,
if (!flag) break;
被放在函数中间的原因是为了在正向冒泡和反向冒泡之间进行判断。这段代码的逻辑是这样的:- 首先进行正向冒泡,找到剩下中最大的数,将其冒泡到正确的位置。
- 在正向冒泡过程中,如果没有进行数据交换(即
flag
仍然为0),说明剩下的部分已经是有序的,不需要继续排序,因此直接跳出循环。 - 否则,进行反向冒泡,找到剩下中最小的数,将其冒泡到正确的位置。
- 递增
low
,减小high
,进入下一轮的冒泡。
当 flag
为1时,!flag
的值为0,因为取 flag
的逻辑非,所以 if (!flag)
条件不满足,此时执行的是 if (!flag)
的语句块内的代码。
所以,当在一轮排序中发生了数据交换(即 flag
被设置为1),!flag
的值为0,条件 if (!flag)
不成立,因此会继续执行后续的代码,而不是提前退出排序循环。