You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅用if实现荷兰国旗算法失效,改用else if则正常?

荷兰国旗算法中独立if与else if的差异问题

在LeetCode解决颜色排序问题时,使用荷兰国旗算法会遇到一个奇怪的现象:用else if的代码可以正常运行,换成独立if后就失效。以下是具体代码和原因分析:

可正常运行的代码(使用else if)

vector<int> nums = {2,0,2,1,1,0};
int low = 0,mid = 0,high = nums.size() - 1;

while(mid<=high){
    if(nums[mid]==0){
        swap(nums[mid],nums[low]);
        mid++;
        low++;
    }
    else if(nums[mid]==1){
        mid++;
    }
    else if(nums[mid]==2){
        swap(nums[mid],nums[high]);
        high--;
    }
}

无法正常运行的代码(使用独立if)

vector<int> nums = {2,0,2,1,1,0};
int low = 0,mid = 0,high = nums.size() - 1;

while(mid<=high){
    if(nums[mid]==0){
        swap(nums[mid],nums[low]);
        mid++;
        low++;
    }
    if(nums[mid]==1){
        mid++;
    }
    if(nums[mid]==2){
        swap(nums[mid],nums[high]);
        high--;
    }
}

为什么独立if会失效?

荷兰国旗算法的核心逻辑是每一轮循环只处理一次nums[mid]的当前值,else if的结构刚好契合这个要求:每轮循环只会进入其中一个分支,处理完当前mid位置的元素后就结束本轮判断,不会重复修改mid或数组状态。

换成独立if后,问题出在同一轮循环中可能连续触发多个分支,直接破坏了算法的状态一致性:

  • 比如某次循环中nums[mid]是0,进入第一个分支交换后,mid和low都加1。此时如果新的nums[mid]是1,会立刻进入第二个分支让mid再加1;如果新的nums[mid]是2,还会进入第三个分支交换并让high减1。
  • 这种连续操作会跳过对某些元素的正确判断,甚至导致mid超过high后仍继续执行,或者把已经归位的元素重新打乱。

拿初始数组{2,0,2,1,1,0}举例:第一次循环时nums[mid]=2,进入第三个分支交换后high减到4,此时nums[mid]变成了0(交换了原数组最后一位的0)。如果是else if结构,本轮循环直接结束;但用独立if的话,接下来会继续检查第一个if(nums[mid]==0),触发交换操作,导致mid和low错误递增,后续逻辑彻底混乱。

总结来说,else if保证了每轮只处理一次mid位置的元素,而独立if会让同一轮循环中mid的状态被多次修改,完全违背了荷兰国旗算法的分步处理逻辑。

内容的提问来源于stack exchange,提问作者Afrazur Rahman Tial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:22:43