双向冒泡算法(C语言版)

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) 不成立,因此会继续执行后续的代码,而不是提前退出排序循环。

相关推荐

  1. 双向冒泡算法C语言

    2024-04-15 06:24:07       39 阅读
  2. C语言冒泡排序算法的原理

    2024-04-15 06:24:07       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-15 06:24:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-15 06:24:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-15 06:24:07       87 阅读
  4. Python语言-面向对象

    2024-04-15 06:24:07       96 阅读

热门阅读

  1. Android之图片压缩几种方式

    2024-04-15 06:24:07       38 阅读
  2. Android之启动优化

    2024-04-15 06:24:07       39 阅读
  3. 链表linked list: 将新节点链接到链表的末尾

    2024-04-15 06:24:07       41 阅读
  4. 7天八股速记之C++后端——Day 1

    2024-04-15 06:24:07       33 阅读
  5. 创建一个flutter的左划重命名,右划隐藏的功能

    2024-04-15 06:24:07       38 阅读
  6. 熟悉JVM体系结构

    2024-04-15 06:24:07       35 阅读
  7. 4.JVM八股

    2024-04-15 06:24:07       31 阅读
  8. LearnOpenGl练习题-纹理

    2024-04-15 06:24:07       34 阅读
  9. Android DB锁问题

    2024-04-15 06:24:07       37 阅读