一、前言
冒泡排序思想:
相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。如下动画所示
二、原理
算法原理
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个
三、分析
#给定以下列表使用冒泡排序
a=[11,2,6,4,2,5,10]
由上图我们可知,相邻元素交换,一共需要N-1躺,每趟指针移动到哪里结束呢?由图可知,第一趟指向索引值为N-2,第二趟指向索引值为N-3…
因此可写如下程序
a=[11,2,6,4,2,5,10]
def bubble_sort(li):
'''
#一共循环N-1趟
#每趟指针指向最后索引为[0,N-i-1)
即i=0时,[0,N-0-1)区间含有N-2个元素,最后索引为N-2
:param li:
:return:
'''
for i in range(len(li)-1): #一共循环N-1趟
for j in range(len(li)-i-1):#每趟指针指向最后索引为N-i-1
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
print(li)
print(li)
bubble_sort(a)
运行结果如下:
[2, 6, 4, 2, 5, 10, 11]
[2, 4, 2, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]
四、优化
从结果我们可知,第三趟列表已经排好了,从第四趟往后,列表元素都没发生交换。
因此我们是不是可以这样想:当一趟中,元素都没有发生交换,我们就认为列表此时已经排序完成。
优化如下
a=[11,2,6,4,2,5,10]
def bubble_sort(li):
'''
#一共循环N-1趟
#每趟指针指向最后索引为[0,N-i-1)
即i=0时,[0,N-0-1)区间含有N-2个元素,最后索引为N-2
:param li:
:return:
'''
for i in range(len(li)-1): #一共循环N-1趟
exchange=False
for j in range(len(li)-i-1):#每趟指针指向最后索引为N-i-1
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange=True
if not exchange: #若一趟后,元素没有交换,则排序完成,直接return
return li
print(li)
print(li)
bubble_sort(a)
最终结果为:
[2, 6, 4, 2, 5, 10, 11]
[2, 4, 2, 5, 6, 10, 11]
[2, 2, 4, 5, 6, 10, 11]