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

C语言冒泡排序代码中inner和outer的工作原理是什么

冒泡排序代码中outer与inner变量的关联逻辑

首先纠正你的误解:inner和outer都不是固定对应某一个数组元素的变量,二者都是数组下标,直接通过nums[下标]的形式访问对应位置的元素,取值会随着循环推进动态变化,不存在「inner固定对应nums[0]、outer固定对应nums[1]」的对应关系。

核心排序代码段

先把你困惑的排序逻辑单独摘出来:

for (outer = 0; outer < 9; outer++)
{
    didSwap = 0;
    for (inner = outer; inner < 10; inner++)
    {
        if (nums[inner] < nums[outer])
        {
            temp = nums[inner];
            nums[inner] = nums[outer];
            nums[outer] = temp;
            didSwap = 1;
        }
    }
    if (didSwap == 0)
    {
        break;
    }
}

两个循环变量的分工

  • outer:标记当前待排序区间的起始位置。每跑完一轮外层循环,nums[outer]位置就会被放上当前待排序区间里的最小值,成为已排序部分的最后一个元素,后续循环不会再修改这个位置的值。
  • inner:在每一轮外层循环固定outer值后,从outer位置出发,向后遍历所有待排序区间的元素,挨个和nums[outer]比较大小。

循环遍历的完整执行流程

以长度为5的测试数组[37, 12, 59, 24, 8]举例(和原代码10元素数组逻辑完全一致),流程如下:

  1. 第1轮外层循环:outer = 0
    • 内层inner初始值等于outer也就是0,依次取0、1、2、3、4遍历所有元素
    • 每遍历到一个元素就和nums[0]比较,如果比nums[0]小就交换两个位置的值
    • 本轮结束后,nums[0]会变成整个数组的最小值8,这个位置后续不会再改动
  2. 第2轮外层循环:outer自增为1
    • 内层inner初始值同步变成1,依次取1、2、3、4遍历索引1之后的未排序元素,不会再碰已经排好的索引0
    • 遍历比较后会把未排序区间的最小值放到nums[1]位置,这个位置也固定为已排序状态
  3. 后续轮次逻辑完全一致:outer每自增1,内层循环的起始位置就往后挪1位,每次都把当前未排序区间的最小值放到outer对应的位置,直到outer增长到8(10个元素的数组,最后剩1个元素时自然有序,不需要再比较)

代码里的didSwap是提前终止优化标记:如果某一轮内层循环跑下来一次交换都没发生,说明剩下的未排序区间已经完全有序,直接跳出循环不需要再做多余遍历。

注:严格来说这段代码的实现逻辑更接近选择排序,传统冒泡排序是相邻元素两两交换把最大/最小值"冒"到区间端点,不过核心的双层循环遍历逻辑是相通的。

内容的提问来源于stack exchange,提问作者newb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:27:18