【Python】一文理解冒泡排序(Bubble Sort)
1.冒泡排序概念:
冒泡排序(Bubble Sort)是一种简单的排序算法。
算法原理:多次遍历待排序的元素,比较相邻两个元素的大小,如果它们的顺序不正确就交换它们,直到整个序列按照升序或降序排列
动态效果如下图所示:
2. 冒泡排序的基本步骤:
- 从第一个元素开始,依次比较相邻的两个元素。
- 如果前面的元素大于后面的元素(升序排序),则交换它们的位置。
- 继续向后遍历,重复步骤1和步骤2,直到到达数组的倒数第二个元素。
- 重复以上步骤,每次遍历都会将当前最大(或最小)的元素“冒泡”到数组的末端。
- 每次遍历都会将未排序部分的最大(或最小)元素移到正确的位置。
- 重复上述过程,直到整个数组按照要求排序完成。
3.Python代码示例:
def bubble_sort(nums: list):
"""
冒泡排序(升序)
- 每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面
:param nums: 待排序列表
:return: sorted_list - 升序排序好的列表
"""
sorted_list = nums
for i in range(len(sorted_list) - 1):
print(f'第{i + 1}趟排序:')
# 标记,用于减少不必要的比较
swapped = False
for j in range(len(sorted_list) - 1):
if sorted_list[j] > sorted_list[j + 1]:
sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
swapped = True
# 如果在一轮遍历中没有发生交换,说明数组已经有序
if not swapped:
break
return sorted_list
if __name__ == '__main__':
input_list = [64, 34, 25, 50, 123, 543, 12, 22, 11, 90]
print('排序前:', input_list)
sorted_list = bubble_sort(input_list)
print('排序后:', sorted_list)
运行结果:
4. 算法分析
假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。
a. 冒泡排序算法性能
b.时间复杂度:
令排序次数为C、位置移动次数为M
若数据本身就是正序,则进行一次排序即可,且不需进行位置移动,此时Cmin= N - 1, Mmin = 0,所以冒泡排序最好时间复杂度为O(N);
若数据本身就是倒序,需要进行 N -1 次排序,且每次排序 都要进行 N - i 次数据比较(1 ≤ i ≤ N - 1),且每次比较都要进行移动三次进行位置交换,
此时
Cmax = N(N-1)/2 = O(N^2),
Mmax = 3N(N-1)/2 = O(N^2),
所以冒泡排序最坏时间复杂度为O(N^2);
c.算法稳定性:
算法的稳定性是指在排序或其他操作中,具有相同关键字的元素在排序前后的相对位置保持不变。
冒泡排序就是把小的元素往前调或者把大的元素往后调。是相邻的两个元素的比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。