冒泡排序是所有排序算法中最简单的一个。它是一种基于比较排序的算法,这个算法主要的排序思想就是比较每一对相邻的元素,如果它们的顺序不对,就交换它们,最终所有元素达到有序的状态。
首先有一个数组,里面存放着待排序的元素。若需要把比较大的元素排到后面,把小的元素排到前面,那么需要从头到尾开始下面的比较操作:
外循环遍历,内循环比较元素。
最坏情况下,序列是逆序的,需要比较的次数为 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2( n n n 个数据元素最多存在 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1) 对逆序),则对应的时间复杂度是: O ( n 2 ) O(n^2) O(n2)。
最优情况下,序列已经排好序,只需要比较 n − 1 n-1 n−1 次即可退出外循环,即时间复杂度为 Ω ( n 2 ) \Omega(n^2) Ω(n2)。
对于 n n n 个元素来说共有 n ! n! n! 种不同的序列,平均下来每个序列要存在 n ( n − 1 ) 4 \frac{n(n-1)}{4} 4n(n−1) 对逆序,所以冒泡排序平均时间复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2) 。
由于比较交换元素并不开辟额外的内存的空间,故有空间复杂度为: O ( 1 ) O(1) O(1)。
def bubble_sort(array: list, reverse: bool=False) -> None:
'''
array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
reverse: 是否降序, 默认采用升序。
'''
for i in range(len(array) - 1): # loop to access each array element
for j in range(len(array) - i - 1): # loop to compare array elements
# compare two adjacent elements and change > to < to sort in descending order
if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
# swapping elements if elements are not in the intended order
array[j], array[j + 1] = array[j + 1], array[j]
def bubble_sort(array: list, reverse: bool=False) -> None:
'''
array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
reverse: 是否降序, 默认采用升序。
'''
for i in range(len(array) - 1):
flag = False # 旗帜
for j in range(len(array) - i - 1):
if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
array[j], array[j + 1] = array[j + 1], array[j]
flag = True
if not flag:
break
def bubble_sort(array: list, reverse: bool=False) -> None:
'''
array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
reverse: 是否降序, 默认采用升序。
'''
for i in range(len(array) - 1):
flag = False
for j in range(len(array) - i - 1):
if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
array[j], array[j + 1] = array[j + 1], array[j]
flag = True
if flag: # 反向排序
flag = False
for j in range(len(array) - i - 2, 0, -1):
if (array[j - 1] < array[j] if reverse else array[j - 1] > array[j]):
array[j], array[j - 1] = array[j - 1], array[j]
flag = True
if not flag:
break