冒泡排序嵌套for循环的range(n-1)与range(n-i-1)逻辑疑问
冒泡排序两层循环范围的疑问解答
先解释外层循环的range(n-1):
- 冒泡排序的核心是每一轮把当前未排序部分的最大元素“冒”到末尾。对于长度为
n的数组,最多只需要n-1轮排序就足够——经过n-1轮后,前n-1个元素都已排好序,最后一个元素自然处于正确位置,完全没必要再跑第n轮。比如你提供的长度为9的数组,跑8轮就能让整个数组有序。
再看内层循环的range(n-i-1):
- 每完成一轮外层循环(
i从0开始计数),就有i个最大的元素被放到了数组末尾的正确位置,这些元素不需要再参与后续比较。 - 比如
i=0时是第一轮排序,需要比较整个数组的相邻元素,j最大只能到7(因为要比较array[j]和array[j+1],j+1得是数组最后一个索引8),所以范围是n-0-1=8,对应range(8),也就是j取0到7。 - 当
i=1时,已经有1个最大元素固定在末尾,只需要比较前8个元素,j最大到6即可,对应范围n-1-1=7,也就是range(7),j取0到6,以此类推。 - 这种写法能避免重复比较已经排好序的末尾元素,减少不必要的计算,提升排序效率。
拿你给出的数组举例:
- 第1轮(
i=0):内层循环跑8次,把最大的9“冒”到数组最后; - 第2轮(
i=1):内层循环跑7次,把第二大的8“冒”到倒数第二的位置; - ...
- 第8轮(
i=7):内层循环只跑1次,仅比较前两个元素,把较小的放到前面,整个数组就完全有序了。
内容的提问来源于stack exchange,提问作者ChloeXRH
相关产品推荐
相关产品推荐

