Python 冒泡排序过程分析

这里是冒泡排序的写法,作为 Python 新手,我们也能够掌握其使用
接下来,我们就一层层剖开它的面纱。首先要知道冒泡排序的原理是每轮把大的元素排在后面,我们开始模拟一下上面代码的过程
先不管那两层 for 循环,这是比较难理解的点。看到 if 判断,含义就是前一个数与后一个数进行大小比较,如果前一个数比后一个数大,那么交换位置。例如当 i = 0 时,即 4 与 3 比较,由于 4 比 3 大,交换位置,变成 [3, 4, 2, 1]
len(nums) - 1 的值为 3,第一轮 j 的值为 0,进入到内层循环,不难知道这时的 range(0, len(nums) - 1 - j) 等价于 range(0, 3),那么 i = 0 时,4 与 3 比较,交换位置,变为 [3, 4, 2, 1],由于内层循环结束,外层循环才会继续。所以 i = 1 时,4 与 2 比较,交换位置,变为 [3, 2, 4, 1]。继续 i = 2 时,4 与 1 比较,交换位置,变为 [3, 2, 1, 4]
内层循环结束,跳到外层,此时第二轮 j = 1,那么 range(0, len(nums) - 1 - j) 等价于 range(0, 2),所以 i = 0 时,3 与 2 比较,交换位置,变为 [2, 3, 1, 4]。又当 i = 1 时,3 与 1 比较,交换位置,变为 [2, 1, 3, 4]
第三轮 j = 2,那么 range(0, len(nums) - 1 - j) 等价于 range(0, 1),即只有 i = 0,这时 2 和 1 进行比较,交换位置,变为 [1, 2, 3, 4],这样循环结束,得到了排序好的列表
再一次印证了开篇的原理,每一轮结束后把大的元素放在最后,先是最大,其次是第二大,这样依次类推。不难看出第一层 for 循环 for j in range(0, len(nums) - 1) 控制的是轮次,对于四个数而言,最多需要三轮放到后面。对于第二层 for 循环 for i in range(0, len(nums) - 1 - j) 控制的是两个数之间的比较,那么每轮减去 j 是因为,第二轮开始时,已经在第一轮将一个最大的数排在后面,不需要再次比较了,所以减去 j 即减去 1,这样依此类推
理解了上面的原理,我的建议是去写一遍冒泡排序,尝试模拟 [4, 1, 3, 2] 的排序过程