Python3实现数据结构与算法30天——排序——冒泡排序(4)

什么是冒泡排序冒泡排序是一种简单但效率较低的比较型稳定排序算法。最大值就会被放置在了最后一个位置a[n-1]上。接下来进行第二轮循环时只需要考虑前面n-1个数即可。

在数据结构和算法中,排序是一个非常重要的主题。掌握各种排序算法对于开发人员来说是必不可少的技能之一。在这篇文章中,我们将讨论冒泡排序这个经典的排序算法,并使用Python3进行实现。

什么是冒泡排序

冒泡排序是一种简单但效率较低的比较型稳定排序算法。它重复地遍历要进行排序的数组,每次遍历都会依次比较相邻两个元素,如果它们顺序错误就交换位置。

具体来说,假设我们有一个包含n个元素的数组a[0]到a[n-1]。第一轮循环开始时,我们从头到尾遍历数组,并依次比较相邻两个元素a[i]和a[i+1](i从0开始)是否满足条件(例如升序排列)。如果不满足条件,则交换它们位置;否则继续向后遍历直到结束。

第一轮结束后,最大值就会被放置在了最后一个位置a[n-1]上。接下来进行第二轮循环时只需要考虑前面n-1个数即可。每一轮循环都会将当前未确定位置的最大值放置在正确的位置上,直到排序完成。

下面是冒泡排序的Python3实现代码:

“`

def bubble_sort(arr):

n = len(arr)

for i in range(n):

for j in range(0, n-i-1):

if arr[j] > arr[j+1] :

arr[j], arr[j+1] = arr[j+1], arr[j]

时间复杂度和空间复杂度

冒泡排序是一种时间复杂度为O(n^2)的算法。它需要进行n轮循环,每轮循环需要比较n-i次(i从0开始)。因此,总共需要比较n*(n-1)/2次。由于交换两个元素位置也需要花费一定时间,因此平均情况下它的时间复杂度为O(n^2),最好情况下为O(n),最坏情况下为O(n^2)。

另外,由于冒泡排序只涉及相邻元素之间的比较和交换操作,并不需要额外开辟存储空间。因此它的空间复杂度是O(1)。

Python3实现数据结构与算法30天——排序——冒泡排序(4)

优化方案

虽然冒泡排序非常简单易懂,但是效率却并不高。在极端情况下(例如一个已经排好序或者倒序的数组),它的效率会非常低下。因此,我们需要对其进行优化。

一种比较简单的优化方法是增加一个标志位,用于判断本轮循环是否有交换操作。如果没有,则说明数组已经排好序了,可以直接退出循环。

另外一种更为高效的优化方法是记录最后一次交换位置的索引last_swap_index,并将其作为下一轮循环比较范围的上界。由于在last_swap_index之后所有元素已经排好序了,因此不需要再次比较和交换。

下面是优化后冒泡排序Python3实现代码:

last_swap_index = n-1

while last_swap_index > 0:

k = last_swap_index

last_swap_index = 0

for j in range(k):

if arr[j] > arr[j+1]:

last_swap_index = j

冒泡排序虽然简单易懂,但效率并不高,在实际应用中并不常用。但它对于理解其他排序算法以及算法思想具有重要意义。同时,在某些特定情况下(例如数据规模较小、数据基本有序等),它也可能表现出出色的性能。

在日常开发中,我们通常使用Python内置的sorted()函数或者numpy库中提供的sort()函数来进行排序操作。这些函数底层实现采用了更加高效的排序算法,可以大大提高排序效率。