冒泡排序通过多次遍历列表,与之相邻的元素进行比较,将不合乎顺序的元素进行交换,每一次遍历都将下一个最大值放在正确的位置上,每一个元素通过冒泡的形式找到属于自己的一个位置。
为了进一步展示排序过程中元素的位置变化,将示意图展示如下:
Python代码编写如下:
def bubblesort( sequence):
for t in range(len(sequence)-1, 0, -1):
for i in range(t):
if sequence[i]>sequence[i+1]:
temp = sequence[i]
sequence[i] = sequence[i+1]
sequence[i+1] = temp
return sequence
ex_seq = [12, 43,13, 45, 8, 34, 9, 18, 20, 11]
result = bubblesort(ex_seq)
result 结果为:[8, 9, 11, 12, 13, 18, 20, 34, 43, 45]
在交换两个元素的位置时,通常需要一个临时变量来进行存储,Python允许同时赋值,例如:a, b = b, a 利用这个特性,我们可以只使用一条一句完成元素的交换。
sequence[i], sequence[i+1] = sequence[i+1], sequence[i]
假设列表中含有 n 个元素,那么第一轮将会遍历 n-1 次,第二轮将会遍历 n-2 次,依次类推,知道遍历结束为止。总的比较次数为1到 n-1 个整数之和,时间复杂度即为
O
(
n
2
)
O(n^2)
O(n2)。上
q
u
e
r
y
t
i
m
e
s
=
n
(
n
−
1
)
2
=
1
2
n
2
−
1
2
n
query\,times = \frac{n(n-1)}{2} = \frac{1}{2}n^2-\frac{1}{2}n
querytimes=2n(n−1)=21n2−21n
冒泡排序通常被认为是效率最低的一个排序算法,因为他在确定最终位置之前必须交换元素,另外我们发现,如果在某一轮遍历中没有发生元素的交换,就这一表明列表以及有序,可以结束遍历,这种排序也成为短冒泡,代码如下所示:
def short_bubblesort (sequence):
sort_times = len(sequence) -1
flag_exchange = True
while sort_times>0 and flag_exchange:
flag_exchange = False
for i in range(sort_times):
if sequence[i]>sequence[i+1]:
flag_exchange = True
sequence[i], sequence[i+1] = sequence[i+1], sequence[i]
sort_times -= 1
return sequence