什么是冒泡排序?
冒泡排序是将是将一堆无序的元素,通过方法、函数将他们变为有序。【就像是水中冒泡一样,把其中最大(小)的一个一个冒出来】
冒泡排序的原理:
通过函数将第一个元素与其后面的元素进行比较,选出较大(小)的一个,然后继续跟后面的比较,直至比较最后一个。
也就是说通过第一轮比较后列表的末尾的元素应该是这个列表中最大(小)的元素。【理解这个原理,冒泡排序就算是完成一半了】
冒泡排序原理图:
python代码:
a = [21,33,2,4,535,25,252,32,32,24,5,32]
for j in range(len(a)-1):
for i in range(len(a)-1-j):
if a[i] > a[i+1]:
a[i],a[i+1] = a[i+1],a[i]
print(a)
输出结果:
[2, 4, 5, 21, 24, 25, 32, 32, 32, 33, 252, 535]
原理解释:
1.首先我们需要弄清冒泡排序的原理:拿出列表中的一个数跟其下一个属比较,所以我们就可以得到:
a = [21,33,2,4,535,25,252,32,32,24,5,32]
for i in range(len(a)-1):
if a[i] > a[i+1]:
其中 len(a)-1 是因为要比较 n-1 次:这里有12个元素,也就是比较11次,这个没毛病吧。
len(a)就是a列表的长度12,range(len(a)-1) == range(0:11) ,其中 0:11 一共有(11-0)个数(取头不取尾),绕来绕去也就是想说明一个问题:我们遍历了 0~ n-1 【这里可能比较难理解】【注意区分下标和次数】
比较之后需要将他们换位置:
a = [21,33,2,4,535,25,252,32,32,24,5,32]
for i in range(len(a)-1):
if a[i] > a[i+1]:
a[i],a[i+1] = a[i+1],a[i]
print(a)
这样内层函数就做好了,这个时候输出的 a 只会把最大的输出来,而我们需要把每个最大的都打印出来,同理就需要将这一整个for循环再循环几遍,那么到底循环几遍呢?
没错就是 n-1 遍:
a = [21,33,2,4,535,25,252,32,32,24,5,32]
for j in range(len(a)-1):
for i in range(len(a)-1-j):
if a[i] > a[i+1]:
a[i],a[i+1] = a[i+1],a[i]
print(a)
完了,就这样了!
没看懂?
少了个 j 没错,接下来还有一个比较难理解的地方:【对于整个循环】
第一次循环: j = 0, i走到–>n-2 range(0, n-1)
第二次循环: j = 1, i~n-3 range(0, n-1-1)
第三次循环: j = 2, i~n-4 range(0, n-1-1-1)
可得: range(0, n-1-j)
引入 j 的意思:
每次循环后我们就不需要管已经排好序的数了。
外层循环控制走多少次,内层循环控制从头走到尾。
第一次看不懂没关系,多试几次就好了。