![Python算法设计与分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/845/44509845/b_44509845.jpg)
4.2 冒泡排序算法
冒泡排序法是模仿水中气泡上浮过程而创造的排序方法。以递增排序为例,其基本思想是:从第一个数开始,依次比较相邻的两个数,将小数放在前面,大数放在后面,经过一轮比较后,最大的数将位于最后一个位置。然后继续从第一个数开始,依次比较相邻数,直到将倒数第二大的数置于倒数第二位置。如此重复,直到所有数都完成排序。这个过程就好像一个个气泡逐渐从水底浮到了水面上。
例如,有这样一组数据:56, 20, 84, 66, 13,如图4.9所示。按照递增顺序进行排序,步骤如下。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P95_8636.jpg?sign=1739289298-N4lvqlg8FMDYwSKg6wQyNvgrcLW6CSrn-0-d47147013e9aa06977e76b062961b169)
图4.9 原始值
(1)第一次排序。首先用第一个位置的56与第二个位置的20进行比较,因为56大于20,所以进行交换;然后再用第二个位置的56与第三个位置的84进行比较,因为56小于84,所以不用交换;再用第三个位置的84与第四个位置的66进行比较,因为84大于66,所以进行交换;最后用第四个位置84与第五个位置13进行比较,因为84大于13,所以进行交换。这样就完成了第一次排序,排序过程如图4.10所示。
经过第一次排序,最大值84被放在了最后的位置。因此在第二次排序时,只需要从第一个数开始,比较到倒数第二个数,也就是13即可。
为了便于表述,将前面未完成排序的数列称为新数列。后续的相邻数比较将在此数列中进行。
(2)第二次排序。依然从第一个位置开始比较,即20与56比较,20小于56,不用交换位置;然后56与66比较,56小于66,不用交换位置;最后66与13比较,66大于13,交换位置。这样就完成了第二次排序,排序过程如图4.11所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P95_8640.jpg?sign=1739289298-3TCT2623dMj9ZjFjcWO72DiQzHRoXgl4-0-711746fc0b68ae8e4526c6b979064a51)
图4.10 第一次排序过程
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P95_8641.jpg?sign=1739289298-Ac0AIZ9zYBl9oBmbtkx1mcbWt9h9NbXJ-0-9a45b692a6fbd3851f63ef478bfb7423)
图4.11 第二次排序过程
经过第二次排序,已经将新数列(20, 56, 66, 13)中的最大值66,也就是原数列的第二大值,放在了倒数第二的位置。因此,在进行第三次排序时,只需要从第一个数开始,比较到倒数第三个数,也就是13即可。
(3)第三次排序。依然从第一个位置开始比较,即20与56比较,20小于56,不用交换位置;再用56与13比较,56大于13,交换位置。这样就完成了第三次排序,排序过程如图4.12所示。
经过第三次排序,已经将新数列(20, 56, 13)中的最大值56,也就是原数列的第三大值,放在了倒数第三的位置。因此,在进行第四次排序时,只需要从第一个数开始,比较到13即可。
(4)第四次排序。依然从第一个位置开始比较,即20与13比较,20大于13,交换位置。因为只有两个数,第四次排序完成。
(5)第五次排序。此时新数列中只剩下13,13小于20,表明已经是最小的数了。至此,整个冒泡排序完成。第四、五次排序过程如图4.13所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P96_8650.jpg?sign=1739289298-0sLKnf9ElEB87FSzYbcxQ1sX9bmTcJbo-0-353a42778b7ee640afb92c5ba2fa52b7)
图4.12 第三次排序过程
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P96_8651.jpg?sign=1739289298-3lERVQXjd0RBI8TzHc4gPGTpXpNl0H9k-0-dbc93950d67707097a80043fc3e4d72e)
图4.13 第四次排序过程及最终排序结果
接下来用Python代码实现上述冒泡排序算法。
【实例4.3】 使用冒泡排序法将列表中的数字递增排序。(实例位置:资源包\Code\04\03)
用Python代码实现上方示例中的冒泡排序算法,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P96_32951.jpg?sign=1739289298-yajP0tSWRSkJeK6ol06NKvlPEi4fzYO4-0-54d8da91337055e55ccdecec3a0e6830)
运行结果如图4.14所示,排序的步骤和上述介绍的冒泡排序法步骤完全吻合。
【实例4.4】 黄金档各综艺节目收视率排名。(实例位置:资源包\Code\04\04)
如今各电视台在周五的黄金档都会有独播的综艺节目。例如,某周的电视台黄金档综艺节目收视率数据如下:14、27、28、10、21,用冒泡排序法把此收视率按照从高到低的顺序递减排序。用Python实现具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P97_32953.jpg?sign=1739289298-JJr6JCmwO2NHwmXhy5s40F33NVLP50fI-0-22785d606e0379dc0e5ac98b96774566)
运行结果如图4.15所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P97_8923.jpg?sign=1739289298-blK1i9GDLh3klDgvO0szNpUlNHvXdNrN-0-2ce1b2b613edd44a94a595251f9f4fb7)
图4.14 冒泡排序法
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P97_8932.jpg?sign=1739289298-XL8y3N1qNHXoQQZ2q5eblGcM0A0pnC5Q-0-00fa87642c9d2a53abc7e4a355f50532)
图4.15 运行结果