相关概念
定义
冒泡排序(Bubble Sort) 是把一组数据从左边开始进行两两比较交换,小的放前边,打的放后边,通过反复进行比较一直到没有数据需要交换为止。
算法流程
从队首开始,两两比较数值,把大的往后交换,一直到队尾,第一个最大值固定到队尾;
再从队首开始,依次亮亮比较,把次最大放到倒数第二的位置;
依次循环比较,直到完成所有数据的比较和交换,完成冒泡排序。
复杂度
时间复杂度 :算法总共需要 n − 1 n-1 n − 1 趟,随着趟数的增加,比对次数逐渐从 n − 1 n-1 n − 1 减少到 1 1 1 ,并包括可能发生的数据项交换。比对次数是 1 — ( n − 1 ) 1—(n-1) 1— ( n − 1 ) 的累加: 1 2 n 2 − 1 2 n \frac{1}{2}n^{2}-\frac{1}{2}n 2 1 n 2 − 2 1 n
比对时间复杂度是 O ( n 2 ) O(n^{2}) O ( n 2 ) ,交换次数也是。
空间复杂度 :无需 任何额外的存储空间。
代码实现
冒泡排序
def Bubble ( alist) :
for j in range ( len ( alist) - 1 ) :
for i in range ( len ( alist) - j- 1 ) :
if alist[ i] > alist[ i+ 1 ] :
alist[ i] , alist[ i+ 1 ] = alist[ i+ 1 ] , alist[ i]
return alist
Bubble( [ 1 , 2 , 5 , 7 , 3 , 9 ] )
冒泡排序:性能改进
通过监测每次对比是否发生过交换,可以提前确定排序是否完成。
如果某次对比没有发生任何交换,说明已经排好序,可以提前结束算法 。
def Bubble ( alist) :
exchange = True
passnum = len ( alist) - 1
while passnum > 0 and exchange:
exchange = False
for i in range ( passnum) :
if alist[ i] > alist[ i+ 1 ] :
exchange = True
alist[ i] , alist[ i+ 1 ] = alist[ i+ 1 ] , alist[ i]
passnum -= 1
return alist
Bubble( [ 1 , 2 , 5 , 7 , 3 , 9 ] )
选择排序
每次遍历,找出最大、最小值,只交换一次位置。交换时间复杂度下降为 O ( n ) O(n) O ( n ) 。
def selectSort ( lst) :
n = len ( lst)
if n== 1 :
return lst
for i in range ( n- 1 ) :
minposition = i
for j in range ( i+ 1 , n) :
if lst[ minposition] > lst[ j] :
minposition = j
lst[ i] , lst[ minposition] = lst[ minposition] , lst[ i]
return lst
selectSort( [ 1 , 2 , 5 , 7 , 3 , 9 , 3 ] )