一、冒泡排序
一种简单的排序算法,它重复地遍历待排序的数列,比较相邻的两个元素并按照升序或降序交换它们的位置,从而将最大或最小的元素逐渐"浮"到数组的顶端或底端。
按照冒泡排序的思想,我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。过程如下:
冒泡排序是一种稳定排序,值相等的元素并不会打乱原本的顺序。由于该排序算法的每一轮都要遍历所有元素,有n个数,总共遍历(n-1)轮,所以平均时间复杂度是O (n2)。
(1) 基本-冒泡排序
python
def bubbleSort(ll):
#外层循环(轮数)
for i in range(len(ll)-1):
#内层循环(次数)
for j in range(len(ll)-i-1):
#判断两两比较
if ll[j]>ll[j+1]:
#第一个>第二个,则交换
ll[j],ll[j + 1] = ll[j + 1],ll[j]
if __name__ == '__main__':
ll=[5,8,6,3,9,2,1,7]
print('排序前:')
print(ll)
bubbleSort(ll)
print('排序后:')
print(ll)
当排序算法分别执行到第6轮、第7轮时,数列状态如下:
很明显,经过第6轮排序后,整个数列已经是有序了,可是排序算法仍然兢兢业业地继续执行了第7轮排序。
(2) 优化-冒泡排序
python
def bubbleSort2(ll):
#外层循环(轮数)
for i in range(len(ll)-1):
#标识:有序
flag=True
#内层循环(次数)
for j in range(len(ll)-i-1):
#判断两两比较
if ll[j]>ll[j+1]:
#第一个>第二个,则交换
ll[j],ll[j + 1] = ll[j + 1],ll[j]
#还是无序,进行比较交换
flag=False
#数列有序,就直接退出循环
if flag:
break
(3) 优化-双向冒泡排序
python
def bubbleSort3(ll):
#外层循环(轮数)
for i in range(len(ll)//2):
#标识:有序
flag=True
# 奇数轮,从左向右比较和交换
#内层循环(次数)
for j in range(i,len(ll)-i-1):
#判断两两比较
if ll[j]>ll[j+1]:
#第一个>第二个,则交换
ll[j],ll[j + 1] = ll[j + 1],ll[j]
#还是无序,进行比较交换
flag=False
#数列有序,就直接退出循环
if flag:
break
# 偶数轮之前,重新标记为true
# 标识:有序
flag = True
# 偶数轮,从右向左比较和交换
# 内层循环(次数)
for j in range(len(ll) - i - 1,i,-1):
# 判断两两比较
if ll[j] < ll[j - 1]:
# 第一个>第二个,则交换
ll[j], ll[j -1] = ll[j - 1], ll[j]
# 还是无序,进行比较交换
flag = False
# 数列有序,就直接退出循环
if flag:
break
很明显,这个排序的优点是能够在特定条件下,减少排序的回合数;而缺点也很明显,就是代码量几乎增加了1倍。