冒泡排序(Bubble Sort):
作为常见的排序算法之一,主要思想是,通过两层遍历比较相邻两数的大小,交换两数的位置,在每次遍历之后,选出当前无序List中最大的那个放置在当前无序List最后,并将该最大值划分给有序List中,无序List的长度则减1,直到无序List的长度为0,排序完成(从低->高排序为例)
Python 基本实现:
# -*- coding: UTF-8 -*-
def Bubble(x):
#遍历所有元素
for i in range(len(x)-1, 0, -1):
#对剩余的i个无序元素进行遍历,将最大值放到队列最后
for j in range(i):
if x[j]>x[j+1]:
#python的这个两数交换的写法非常赞
x[j],x[j+1]=x[j+1],x[j]
print x
list = [31,45,4,44,33,5,2,68]
Bubble(list)
思考:
冒泡算法属于交换排序中的一种。
时间复杂度
(n-1) + (n-2) + (n-3) + ..... + 3 + 2 + 1
Sum = n(n-1)/2
i.e O(n * n)
空间复杂度
辅助空间:O(1)
优化算法:
# -*- coding: UTF-8 -*-
def Bubble(x):
#通过设置flag对冒泡算法进行优化,当发现某次遍历中没有进行元素交换,则说明剩下的元素已经有序,则结束遍历
flag = True
#遍历所有元素
for i in range(len(x)-1, 0, -1):
if flag:
#初始设置flag=false 表示没有交换
flag = False
#对剩余的i个无序元素进行遍历,将最大值放到队列最后
for j in range(i):
if x[j]>x[j+1]:
#python的这个两数交换的写法非常赞
x[j],x[j+1]=x[j+1],x[j]
flag = True
else:
break
print x
list = [31,45,4,44,33,5,2,68]
Bubble(list)
时间复杂度
平均情况:O(n * n)
最好情况:O(n)
最差情况:O(n * n)
递归实现
def bubble_recursive_sort(x):
for i in range(len(x)-1, 0, -1):
if x[i]<x[i-1]:
x[i],x[i-1]=x[i-1],x[i]
bubble_recursive_sort(x)
return x