公示:相关概念解释及动图来源于https://www.cnblogs.com/onepixel/articles/7674659.html
此篇作为理解排序算法的一个记录,送给不怎么明白排序的小白们
1.冒泡排序
看图解释一下:冒泡排序的实现原理很简单,就是单纯每次做相邻两个数的比较,如果你要升序排列,那只要碰到前一个大于后一个,就交换位置,否者就略过。
def bubbleSort(lis):
length = len(lis)
for i in range(length - 1):
for j in range(length - 1 - i):
if a[j] < a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
return lis
a = [123, 45, 324, 21, 4, 56, 2, 6, 32, 56, 12, 5, 1, 5, 345]
al = bubbleSort(a)
print(al)
但是,有时候脑袋转不过来的人想要自己按这个原理实现的时候,却无法做到正确排序。只能死记正确的排序代码。这样不行的,很容易忘记。必须彻底理解,这样才能再一次需要的时候顺手拈来。
为什么明明已经知道实现原理,但是还是无法实现呢?以我的经验(额,不想承认我就是转不过来),其实需要理解其中几个细节。
- 我们遍历整个数组,只是将此次遍历的最大(最小)的数把他们移到最顶端。但不是遍历1次!!!所以,不管你使用while还是for,都必须是循环n-1次,n为数组长度,为什么是n-1,因为每次只能确定一位最大(最小)的数,遍历到n-1次,就能保证判断两次时候交换的时候不会产生index过界的错误,毕竟你遍历到第n遍的时候,第二次循环只有一个,还怎么跟他的下一个比?
- 其次,每次遍历都能把此次遍历的数字中最大(最小)的数放在最后面(前面),所以下次遍历其实不需要再去比较后面的数字,当然你去比较也没问题,只是此时的排序算法,时间复杂度要高,可以想象你排序的数量极大的时候,将更加耗时!
- 你看到两次嵌套循环,为什么要两个循环?第一个循环是为了第一点 ---执行遍历n次(i 在python 的for循环中默认起始为第一个,所以不需要length-1)。第二个for循环就是真正的遍历数组,将最值放在数组顶端。
以上就是我自己是思考冒泡排序时想明白之后一些感悟,留给那些懵懂不知的小白。