【Python】一文理解冒泡排序(Bubble Sort)

【Python】一文理解冒泡排序(Bubble Sort)

1.冒泡排序概念:

冒泡排序(Bubble Sort)是一种简单的排序算法。
算法原理:多次遍历待排序的元素,比较相邻两个元素的大小,如果它们的顺序不正确就交换它们,直到整个序列按照升序或降序排列
动态效果如下图所示:
在这里插入图片描述

2. 冒泡排序的基本步骤:

  1. 从第一个元素开始,依次比较相邻的两个元素。
  2. 如果前面的元素大于后面的元素(升序排序),则交换它们的位置。
  3. 继续向后遍历,重复步骤1和步骤2,直到到达数组的倒数第二个元素。
  4. 重复以上步骤,每次遍历都会将当前最大(或最小)的元素“冒泡”到数组的末端。
  5. 每次遍历都会将未排序部分的最大(或最小)元素移到正确的位置。
  6. 重复上述过程,直到整个数组按照要求排序完成。

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.算法稳定性:
算法的稳定性是指在排序或其他操作中,具有相同关键字的元素在排序前后的相对位置保持不变
冒泡排序就是把小的元素往前调或者把大的元素往后调。是相邻的两个元素的比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值