今天咱们把常见的几种排序算法,整理了一下,希望能对正在看这篇帖子的你有轻微的小帮助
依照惯例,在写每一篇帖子之前,笔者都会遵循以下几点原则:
1、如果一个什么都不懂的人都能把这篇文章看懂,那就说明这篇博客通俗易懂
2、尽量保持排版整齐,让读者阅读起来不是那么累,简单舒服即可
3、尽可能的保证所写的东西是正确的,若能帮到疑惑中的你一点点小作用,是笔者坚持写下去的动力
一、冒泡排序
什么是冒泡排序,它的原理是什么?
有没有一个人能帮我讲明白其中的逻辑?
最后能不能用代码敲出一个例子?
如何帮大家回答这三个问题,且看我慢慢叙来。
冒泡排序:从字面意思上来理解,像气泡一样一个一个的从水底升上来,上面的最大,底部的最小。
原理就是比较相邻两个元素的大小,小的往前放,大的往后放,每经过一轮排序都可以找出最大的元素出来
比如:有一个列表【11、9、2、78、45、32、17】,现在开始以这个为例来演示。
第一轮步骤:①11比9大,所以变成9、11、2、78、45、32、17
②11比2大,又变成 9、2、11、78、45、32、17
③11比78小,位置不变,开始比较78与45,78比45大,所以变成 9、2、11、45、78、32、17
④78比32大,变成 9、2、11、45、32、78、17
⑤78比17大,变成 9、2、11、45、32、17、78
因此,第一轮排序过后,就可以找出78这个最大元素。
第一轮排序后的列表各元素的位置【9、2、11、45、32、17、78】
第二轮步骤:①9比2大,位置变成 2、9、11、45、32、17、78
②9比11小,位置不变
③11比45小,位置不变
④45比32大,位置变成 2、9、11、32、45、17、78
⑤45比17大,位置变成 2、9、11、32、17、45、78
⑥45比78小,位置不变,所以 2、9、11、32、17、45、78
因此,第二轮排序过后,可以找出第二大的元素45
第二轮排序后的列表各元素的位置【2、9、11、32、17、45、78】
第三轮排序:①2比9小,位置不变
②9比11小,位置不变
③11比32小,位置不变
④32比17大,位置变成 2、9、11、17、32、45、78
⑤32比45小,位置不变
⑥45比78小,位置不变
因此,第三轮排序后,可以找出第三大的元素32
所以第三轮排序后的列表各元素的位置 【2、9、11、17、32、45、78】
因此上面的那个列表经过三轮排序,就可以冒泡升序排列(从小到大排序出来)
其实,通过上面的例子,原理就是两个相邻的元素取比较大小,大的往右挪,小的往左挪。
再看看下面的代码实现:
def dubble_sort(list): for i in range(1, len(list)): for j in range(0, len(list) - i): if list[j] > list[j + 1]: list[j], list[j + 1] = list[j + 1], list[j] return list li1 = [11, 9, 2, 78, 45, 32, 17] print(dubble_sort(li1))
此时,有个同学站了出来,提出一个疑问:难道冒泡排序只能从小到大,不能从大到小吗?
其实,也可以,即使从大到小排列也是可以的,这里我们只是为了举例,从小到大理解起来较为容易而已,如果你想在此基础上进行降序排列,有个reverse()方法