今天来看一下标准的冒泡排序。首先定义一个交换位置的函数swap,放在swap.py
#定义交换位置的函数 def swap(L, i, j): t = L[i] L[i] = L[j] L[j] = t return L
接下来是冒泡排序算法(python)
from swap import swap
def BubbleSort1(L): for i in range(0, len(L)): for j in range(len(L) - 2, i - 1, -1): if L[j] > L[j + 1]: L = swap(L, j, j + 1) return L
注意第二个for循环中,len(L) - 2 是指列表的倒数第二个数字,由于range()函数是前闭后开的,因而后面应该是i-1。比如当i=2时,j应该是在len(L)-2到2 之间,当j变为2时, 是L[2]和L[3]比大小,并交换位置,而此时的L[0]和L[1]都位于正确的位置,不需要比较了。过程如下:(下图来自《大话数据结构》)
但是仔细考虑有个问题,比如当i = 2时,j从Len(L)到2都没有发生交换,也就是说前一次循环已经使得列表有序,之后的循环实际都不需要了,因而改进如下,方法是添加一个flag标记
#改进的冒泡排序 def BubbleSort2(L): for i in range(0, len(L)): flag = False for j in range(len(L) - 2, i - 1, -1): if L[j] > L[j + 1]: L = swap(L, j, j + 1) flag = True if not flag: break return L
与前面的区别是这里多了一个布尔变量flag,并对flag进行了判断。在每次进入第一个for loop 时,初始化flag为False,如果交换,则flag赋值为True,在第二个for loop结束后 对flag的值进行判断,若为False ,则说明没有发生交换,列表已经有序,退出for loop,结束程序。
冒泡排序的时间复杂度为O(n2)