冒泡排序需要多次遍历列表。Figure 1 展示了冒泡排序的第一次遍历。阴影项正在比较它们是否乱序。如果在列表中有 n 个项目,则第一遍有 n-1 个项需要比较。交换操作,有时称为 swap ,在Python 中与在大多数其他编程语言略有不同。通常,交换列表中的两个元素需要临时存储位置(额外的内存位置)。代码片段如下
temp=alist[i]
alist[i]=alist[j]
alist[i]=temp
在Python中,可以执行同时赋值。语句 a,b = b,a两个赋值语句同时完成。使用同时分配,交换操作可以在一个语句中完成。
def bubbleSort(alist):
for passnum in range(len(alist)-1,0,-1):
for i in range(passnum):
if alist[i]>alist[i+1]:
#alist[i], alist[i + 1] = alist[i + 1], alist[i]
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
为了分析气泡排序,我们应该注意,不管项如何在初始列表中排列,将进行 n-1 次遍历以排序大小为 n 的列表。 Figure 1 展示了每次通过的比较次数。比较的总数是第 n-1 个整数的和。回想起来,前 n 个整数的和是 1/2n^2 + 1/2n。 第 n-1 个整数的和为 1/2n^2 + 1/2n -n,其为1/2n^2 - 1/2n。 这仍然是 O(n2) 比较。在最好的情况下,如果列表已经排序,则不会进行交换。但是,在最坏的情况下,每次比较都会导致交换元素。平均来说,我们交换了一半时间。
短冒泡排序
冒泡排序通常被认为是最低效的排序方法,因为它必须在最终位置被知道之前交换项。这些“浪费”的交换操作是非常昂贵的。然而,因为冒泡排序遍历列表的整个未排序部分,它有能力做大多数排序算法不能做的事情。特别地,如果在遍历期间没有交换,则我们知道该列表已排序。如果发现列表已排序,可以修改冒泡排序提前停止。这意味着对于只需要遍历几次列表,冒泡排序具有识别排序列表和停止的优点。
def shortBubbleSort(alist):
exchanges = True
passnum = len(alist)-1
while passnum > 0 and exchanges:
exchanges = False
for i in range(passnum):
if alist[i]>alist[i+1]:
exchanges = True
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
passnum = passnum-1