👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。
【python】冒泡法详解(python实现)
目录
- 【python】冒泡法详解(python实现)
- 1. 原理说明
- 2. 举例说明
- 3. 代码实现
1. 原理说明
冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的元素,并根据需要交换它们的位置,直到整个列表排序完成为止。冒泡排序的原理可以简单概括为以下步骤:
比较相邻元素:从列表的第一个元素开始,依次比较相邻的两个元素,比较的方式取决于排序的顺序(升序或降序)。
交换位置:如果相邻两个元素的顺序不符合排序要求,则交换它们的位置,将较大(或较小)的元素放在后面。
继续遍历:重复执行步骤 1 和步骤 2,直到遍历完整个列表。每一轮遍历都会将最大(或最小)的元素移动到列表的末尾。
缩小范围:在每一轮遍历后,列表的最后一个元素已经排好序,因此在下一轮遍历时可以减少一个元素的比较次数。
这个过程类似于气泡冒上水面的过程,每一次遍历都会让最大(或最小)的元素“冒泡”到合适的位置,因此得名“冒泡排序”。
2. 举例说明
给定列表 a = [9, 8, 10, 5, 7, 3, 5, 2, 6],我们使用冒泡排序进行升序排序:
第一轮遍历: 比较 [9, 8, 10, 5, 7, 3, 5, 2, 6]
9 > 8,交换位置得到 [8, 9, 10, 5, 7, 3, 5, 2, 6]
9 < 10,位置不变 [8, 9, 10, 5, 7, 3, 5, 2, 6]
10 > 5,交换位置得到 [8, 9, 5, 10, 7, 3, 5, 2, 6]
10 > 7,交换位置得到 [8, 9, 5, 7, 10, 3, 5, 2, 6]
10 > 3,交换位置得到 [8, 9, 5, 7, 3, 10, 5, 2, 6]
10 > 5,交换位置得到 [8, 9, 5, 7, 3, 5, 10, 2, 6]
10 > 2,交换位置得到 [8, 9, 5, 7, 3, 5, 2, 10, 6]
10 > 6,交换位置得到 [8, 9, 5, 7, 3, 5, 2, 6, 10]
第一轮遍历结束后,最大的元素 10 已经“冒泡”到了最后的位置。
第二轮遍历:比较 [8, 9, 5, 7, 3, 5, 2, 6, 10]
8 < 9,位置不变 [8, 9, 5, 7, 3, 5, 2, 6, 10]
9 > 5,交换位置得到 [8, 5, 9, 7, 3, 5, 2, 6, 10]
9 > 7,交换位置得到 [8, 5, 7, 9, 3, 5, 2, 6, 10]
9 > 3,交换位置得到 [8, 5, 7, 3, 9, 5, 2, 6, 10]
9 > 5,交换位置得到 [8, 5, 7, 3, 5, 9, 2, 6, 10]
9 > 2,交换位置得到 [8, 5, 7, 3, 5, 2, 9, 6, 10]
9 > 6,交换位置得到 [8, 5, 7, 3, 5, 2, 6, 9, 10]
第二轮遍历结束后,第二大的元素 9 也“冒泡”到了倒数第二个位置。
第三轮遍历:比较 [8, 5, 7, 3, 5, 2, 6, 9, 10]
8 > 5,交换位置得到 [5, 8, 7, 3, 5, 2, 6, 9, 10]
8 > 7,交换位置得到 [5, 7, 8, 3, 5, 2, 6, 9, 10]
8 > 3,交换位置得到 [5, 7, 3, 8, 5, 2, 6, 9, 10]
8 > 5,交换位置得到 [5, 7, 3, 5, 8, 2, 6, 9, 10]
8 > 2,交换位置得到 [5, 7, 3, 5, 2, 8, 6, 9, 10]
8 > 6,交换位置得到 [5, 7, 3, 5, 2, 6, 8, 9, 10]
第三轮遍历结束后,第三大的元素 8 也“冒泡”到了倒数第三个位置。
依次类推,经过多轮遍历,列表中的元素逐渐排好序,直到整个列表排序完成。
注意:冒泡排序是一种简单但效率较低的排序算法,特别是在处理大量数据时,它的时间复杂度为 O(n^2)。其他更高效的排序算法如快速排序和归并排序通常更受青睐。
3. 代码实现
代码如下(示例):
a = [9, 8, 10, 5, 7, 3, 5, 2, 6]
def arr_sorted(a):
n = len(a)
for i in range(n):
for j in range(n-1-i):
if a[j] > a[j+1]:
a[j], a[j + 1] = a[j+1], a[j]
return a
print(arr_sorted(a))
运行结果:
[9, 8, 10, 5, 7, 3, 5, 2, 6]