Bubble Sort 背后的想法非常简单,我们查看数组中相邻的成对元素,一次查看一对。
如果第一个元素大于第二个元素,则交换它们的位置,否则将它们继续移动。
def bubble_sort(our_list):
for i in range(len(our_list)-1):
if our_list[i] > our_list[i+1]:
our_list[i], our_list[i+1] = our_list[i+1], our_list[i]
return our_list
list = [8, 3, 2, 5, 1, 4]
b = bubble_sort(list)
b
[3, 2, 5, 1, 4, 8]
这样只进行了一次冒泡,并未完成
每一次冒泡都只有一个数据冒泡成功,所以要比较的次数就是这列数组中含有的数据的个数
def bubble_sort(our_list):
for j in range(len(our_list)):
for i in range(len(our_list)-1):
if our_list[i] > our_list[i+1]:
our_list[i], our_list[i+1] = our_list[i+1], our_list[i]
return our_list
a = [8, 3, 2, 5, 1, 4]
b = bubble_sort(a)
print(b)
[1, 2, 3, 4, 5, 8]
可改进的点:
1、如果原来的数组就是有序的,即在第一次冒泡的时候没有发生数组位置的交换,那么就可以不用接着循环
2、每一次冒泡都可以保证有一个数据冒出来,所以在后一次冒泡的时候可以不去和最末尾的一个进行比较
def bubble_sort(our_list):
has_swapped = True #判断是否有序的标志,开始时置为真
n = len(our_list)
num_of_iterations = 0 #控制遍历次数,没经过一次冒泡可以少比较一次
while(has_swapped):
has_swapped = False
for i in range(len(our_list) - num_of_iterations - 1):
if our_list[i] > our_list[i+1]:
# Swap
our_list[i], our_list[i+1] = our_list[i+1], our_list[i]
has_swapped = True
num_of_iterations += 1
return our_list
a = [8, 3, 2, 5, 1, 4]
b = bubble_sort(a)
print(b)
[1, 2, 3, 4, 5, 8]