做一个关于循环的练习,来加深大家的学习成果。
这个练习叫什么呢?我们就用Python实现冒泡排序
冒泡排序
要学习冒泡排序必须知道它的原理:
所谓冒泡,就是将元素两两之间进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。(图中排好序的元素标记为黄色柱子)
说得不清楚,我们看看下面的动图就应该明白了
代码
下面,我们就进入代码环节。
现在,我给你一个
nums = [3,1,25,6,8,10,15]
,要求你用Python将nums实现冒泡排序。
看上去很难入手,其实很简单,我先给出代码
nums = [3,1,25,6,8,10,15]
for i in range(len(nums)-1):
for j in range(len(nums) - i -1):
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
print("第"+str(j)+"次内循环"+str(nums))
print("第"+str(i)+"次外循环"+str(nums))
print("最后的结果"+str(nums))
我们先遍历nums,这不就是我们的range(len(nums)-1),至于为什么是range(len(nums)-1),其实就是我们的下标从0开始的,
len(nums)返回是7,range是左开右闭,但是冒泡排序,我们只需要取到
nums[5] = 10 就足够了,所以这里range(len(nums)-1),取到[3,1,25,6,8,10]
。然后,我们在遍历之后的nums,比如i = 0,我们将j
取值范围到len(nums) - i -1,用nums[j] > nums[j+1]
判断两两的大小, 每次内循环将最大的移到最右边。
每一次内循环的目的就是将当中最大的移到最右边,而每一次外循环的目的就是当最大的移到最右边后,缩小范围,再寻找最大的数,再把它移到最右边。
我们执行上面的代码的结果如下:
第0次内循环[1, 3, 25, 6, 8, 10, 15]
第1次内循环[1, 3, 25, 6, 8, 10, 15]
第2次内循环[1, 3, 6, 25, 8, 10, 15]
第3次内循环[1, 3, 6, 8, 25, 10, 15]
第4次内循环[1, 3, 6, 8, 10, 25, 15]
第5次内循环[1, 3, 6, 8, 10, 15, 25]
第0次外循环[1, 3, 6, 8, 10, 15, 25]
第0次内循环[1, 3, 6, 8, 10, 15, 25]
第1次内循环[1, 3, 6, 8, 10, 15, 25]
第2次内循环[1, 3, 6, 8, 10, 15, 25]
第3次内循环[1, 3, 6, 8, 10, 15, 25]
第4次内循环[1, 3, 6, 8, 10, 15, 25]
第1次外循环[1, 3, 6, 8, 10, 15, 25]
第0次内循环[1, 3, 6, 8, 10, 15, 25]
第1次内循环[1, 3, 6, 8, 10, 15, 25]
第2次内循环[1, 3, 6, 8, 10, 15, 25]
第3次内循环[1, 3, 6, 8, 10, 15, 25]
第2次外循环[1, 3, 6, 8, 10, 15, 25]
第0次内循环[1, 3, 6, 8, 10, 15, 25]
第1次内循环[1, 3, 6, 8, 10, 15, 25]
第2次内循环[1, 3, 6, 8, 10, 15, 25]
第3次外循环[1, 3, 6, 8, 10, 15, 25]
第0次内循环[1, 3, 6, 8, 10, 15, 25]
第1次内循环[1, 3, 6, 8, 10, 15, 25]
第4次外循环[1, 3, 6, 8, 10, 15, 25]
第0次内循环[1, 3, 6, 8, 10, 15, 25]
第5次外循环[1, 3, 6, 8, 10, 15, 25]
最后的结果[1, 3, 6, 8, 10, 15, 25]
我们可以看到,第0次外循环,已经将25放在了最右边,第1次外循环确定把15放到最右边,这样从右往左,从大到小,这就是完整的冒泡排序。