前言
算法步骤:
代码实现
方法一、嵌套循环
方法二 while循环
方法三、使用生成器表达式
解释:
时间复杂度:
完结撒花
前言
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻的元素可以交换,就表明完成了排序。
算法步骤:
- 从列表的第一个元素开始,比较它与下一个元素。
- 如果第一个元素大于第二个元素,则交换它们的顺序。
- 继续比较相邻元素,直到到达列表的末尾。
- 重复步骤 1-3,直到列表中所有元素都按从小到大的顺序排列。
给定一个列表 [5, 3, 1, 2, 4]
,使用冒泡排序对其进行排序:
nums = [5, 3, 1, 2, 4]
第 1 次循环:
- 比较 5 和 3,交换它们的位置,得到
[3, 5, 1, 2, 4]
。 - 比较 5 和 1,交换它们的位置,得到
[3, 1, 5, 2, 4]
。 - 比较 5 和 2,交换它们的位置,得到
[3, 1, 2, 5, 4]
。 - 比较 5 和 4,不交换,因为 5 已经大于 4。
第 2 次循环:
- 比较 3 和 1,交换它们的位置,得到
[1, 3, 2, 5, 4]
。 - 比较 3 和 2,交换它们的位置,得到
[1, 2, 3, 5, 4]
。 - 比较 3 和 5,不交换,因为 3 已经小于 5。
- 比较 5 和 4,交换它们的位置,得到
[1, 2, 3, 4, 5]
。
第 3 次循环:
- 比较 1 和 2,不交换,因为 1 已经小于 2。
- 比较 2 和 3,不交换,因为 2 已经小于 3。
- 比较 3 和 4,不交换,因为 3 已经小于 4。
- 比较 4 和 5,不交换,因为 4 已经小于 5。
经过 3 次循环,列表中的元素已经按从小到大的顺序排列好了:[1, 2, 3, 4, 5]
。
代码实现
方法一、嵌套循环
def bubble_sort(nums):for i in range(len(nums)):for j in range(0, len(nums) - i - 1):if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]return nums
方法二 while循环
def bubble_sort(nums):swapped = Truewhile swapped:swapped = Falsefor i in range(0, len(nums) - 1):if nums[i] > nums[i + 1]:nums[i], nums[i + 1] = nums[i + 1], nums[i]swapped = Truereturn nums
方法三、使用生成器表达式
def bubble_sort(nums):while True:swapped = Falsefor i in range(0, len(nums) - 1):if nums[i] > nums[i + 1]:nums[i], nums[i + 1] = nums[i + 1], nums[i]swapped = Trueif not swapped:breakreturn nums
解释:
- 该方法使用两个嵌套的循环,类似于方法 1。
- 外层循环用于跟踪排序的趟数。
- 内层循环用于比较相邻元素并进行交换。
swapped
变量用于跟踪是否在当前趟中进行了任何交换。- 如果在某趟中没有进行任何交换,则说明列表已经排序好,算法提前终止。
最后排序结果
nums = [5, 3, 1, 2, 4]
print(bubble_sort(nums)) # 输出:[1, 2, 3, 4, 5]
时间复杂度:
冒泡排序的时间复杂度为 O(n^2),其中 n 是列表的长度。这是因为算法需要比较和交换列表中的每个元素,而这需要 O(n) 的时间。对于每个元素,算法需要比较和交换它与列表中其他所有元素,这又需要 O(n) 的时间。因此,总的时间复杂度为 O(n^2)
优点:
- 简单易懂,实现方便。
- 对数据没有特殊要求,可以处理各种类型的列表。
缺点:
- 时间复杂度高,对于大型列表排序效率较低。
- 稳定性差,即相同元素在排序后的顺序不确定。
完结撒花
本期为大家带来了Python冒泡排序法的解题思路,因为仅仅只是学习,不敲代码逻辑思维能力是上不去的,所以发了一期Python版的冒泡排序法的算法题,通过练习,才可以提升在编程中的编码能力和逻辑思维能力。
如果对博主感兴趣欢迎大家点赞+关注,添加博主联系方式一起探索哦!