✏️ 纠错
第 241 题 / 共 301 题
第15题 为了提高冒泡排序的效率,如果某轮“冒泡”中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果,则两条横线上分别应该填写( )。
void bubbleSortWithFlag(vector<int>&nums) {
    for (int i = nums.size() - 1; i > 0; i--) {
        bool flag;
        ________ // 在此处填入代码

        for (int j = 0; j < i; j++) {
            if (nums[j] > nums[j + 1]) {
                swap(nums[j], nums[j + 1]);
                ________ // 在此处填入代码
            }
        }
        if (!flag)
            break;
    }
}
📝 题目解析

【考纲知识点】冒泡排序的优化

【正确答案】B

【题目解析】

优化逻辑:

使用标志位flag检测当前轮次是否发生交换。

若未发生交换,说明数组已完全有序,可提前终止循环。

标志位的设置:

外层循环开始:初始化为false,假设本轮无交换。

发生交换时:将flag设为true,表明数组仍需继续排序。

选项分析:

A错误:两次均设为false会导致无论是否交换,flag始终为false,循环在第一轮后即终止。

B正确:初始设false,发生交换时设true,符合逻辑。

C错误:初始设true,若未发生交换,flag保持true,导致无法提前终止循环。

D错误:两次均设true,flag始终为true,优化失效。

通过初始false假设有序,发生交换时置true,未交换则提前退出。因此,正确答案为B。