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轮外层循环:
outer = 0- 内层
inner初始值等于outer也就是0,依次取0、1、2、3、4遍历所有元素 - 每遍历到一个元素就和
nums[0]比较,如果比nums[0]小就交换两个位置的值 - 本轮结束后,
nums[0]会变成整个数组的最小值8,这个位置后续不会再改动
- 内层
- 第2轮外层循环:
outer自增为1- 内层
inner初始值同步变成1,依次取1、2、3、4遍历索引1之后的未排序元素,不会再碰已经排好的索引0 - 遍历比较后会把未排序区间的最小值放到
nums[1]位置,这个位置也固定为已排序状态
- 内层
- 后续轮次逻辑完全一致:
outer每自增1,内层循环的起始位置就往后挪1位,每次都把当前未排序区间的最小值放到outer对应的位置,直到outer增长到8(10个元素的数组,最后剩1个元素时自然有序,不需要再比较)
代码里的didSwap是提前终止优化标记:如果某一轮内层循环跑下来一次交换都没发生,说明剩下的未排序区间已经完全有序,直接跳出循环不需要再做多余遍历。
注:严格来说这段代码的实现逻辑更接近选择排序,传统冒泡排序是相邻元素两两交换把最大/最小值"冒"到区间端点,不过核心的双层循环遍历逻辑是相通的。
内容的提问来源于stack exchange,提问作者newb
相关产品推荐
相关产品推荐

