目录
一、冒泡排序Bubble Sort
冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项交换位置,最终能将本趟的最大项就位。经过n-1趟比较,实现整表排序,每趟的过程类似于“气泡”在水中不断上浮到水面的经过。
- 第一趟比较交换,共有n-1对相邻数据进行比较。一旦经过最大项,则最大项会一路交换到达最后一项。
- 第二趟比较交换是,最大项已经就位,需要排序的数据减少为n-1,共有n-2对相邻数据进行比较。
- 直到第n-1趟完成后,最小项一定在列表首位,就无需处理了。
二、算法分析
无序表初始数据项的排列状况对冒泡排序没有影响。
算法过程共需要n-1趟,随着趟数的增加,比对次数逐步从n-1减少到1,并包括可能发生的数据项交换。
比对次数是1到n-1的累加:1/2 * (n*n-1),比对的时间复杂度是O(n^2)。
关于交换次数,时间复杂度也是O(n^2),通常每次交换包括3次赋值,最好的情况是列表在排序前已经有序,交换次数为0。最差的情况是每次比对都要进行交换,交换的次数等于比对的次数,平均情况则是最差情况的一半。
冒泡排序通常作为时间效率较差的排序算法,来作为其它排序算法的对比基准,其效率主要差在每个数据项在找到其最终位置之前必须要经过多次对比和交换,其中的大部分操作是无效的,但是有一点优势,就是无需任何额外的存储空间开销。
代码:
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]
return alist
三、性能改进
通过每趟比对是否发生过交换可以提前确定排序是否完成,这也是其他多数排序算法无法做到的。如果某趟对比没有发生任何交换,说明列表已经排好序,则可以提前结束算法。
代码:
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
alist[i], alist[i+1] = alist[i+1], alist[i]
passnum = passnum - 1
return alist