冒泡排序
算法描述
冒泡排序的算法思想是:每次比较相临两个元素的值,若不符合顺序,则将两者交换;最终多次交换(第一遍循环)后,最大(最小)的元素沉淀到最后;然后针对剩余的前n-1个元素,再进行第二遍循环比较,最后将第二大(小)的元素沉淀到最后。持续照此过程,直到排序完成。
算法实现(Python)
def Bubble(arr):
for i in range(len(arr)-1,0,-1):
for j in range(i):
if arr[j]>arr[j+1]:
arr[j],arr[j+1]=arr[j+1],arr[j]
print arr
if __name__=='__main__':
arr=[7,4,9,2,5,1]
Bubble(arr)
算法改进
上面这种算法存在一个缺点,即不管中间某次排序过程后,序列是否已经排好序,都要要进行n-1次循环比较。因此,会存在冗余的排序过程,增加了时间复杂度,改进如下(增加布尔变量flag):
def Bubble(arr):
flag=False
for i in range(len(arr)-1,0,-1):
for j in range(i):
if arr[j]>arr[j+1]:
arr[j],arr[j+1]=arr[j+1],arr[j]
flag=True
if not flag:
break
print arr
if __name__=='__main__':
arr=[7,4,9,2,5,1]
Bubble(arr)
当某次循环过程中,一次值交换都没发生,说明序列已经排好序,则退出迭代过程。
算法复杂度
最坏情况:序列逆序,需要进行n*(n-1)/2次基础操作,时间复杂度为O(n^2)
最好情况:序列顺序,需要进行n-1次基础操作,时间复杂度为O(n)
平均情况:时间复杂度为O(n^2)