冒泡排序
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
代码实现:
def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1): #j=0时 就是列表第一个
#-1是因为用li[j+1]作比较的 所以-
if li[j] > li[j+1] : #这一步是只能排序后一个比前一个大比一定比前2个大
li[j],li[j+1] = li[j+1],li[j] #每一次迭代都是将最小的往前移动一位
li = [random.randint(0,8) for i in range(6)]
print(li)
bubble_sort(li)
print(li)
因为是做算法,本着能省则省,能快则快原则,以上代码可以有优化
def bubble_sort1(li):
for i in range(len(li)-1):
exchange = False
for j in range(len(li)-i-1):
if li[j] > li[j+1] :
li[j],li[j+1] = li[j+1],li[j]
exchange=True
print(li)
if not exchange: #本次循环没有调整一个位置 说明一切排序已经完成
return
li = [9,8,7,1,2,3,4,5,6]
bubble_sort1(li)
输出:
[8, 7, 1, 2, 3, 4, 5, 6, 9]
[7, 1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
从这个优化的算法可以看出,冒泡排序如果两个比较的比较的元素符合排序规则是不需要交换的,
所以是稳定的排序方式
并最乐观的时候,有排序好的可以直接输出
综上,因此冒泡排序总的平均时间复杂度为