冒泡排序
概念
从左到右不断交换相邻逆序的元素,在一轮的循环后,可以让未排序的最大(或最小)元素在最右侧。在一轮循环后,如果没有发生交换,那么已经是有序的,可以直接退出了。
基本的代码实现
lista = [34,19,20,30,10,5,88,9]
#循环次数
for i in range(len(lista)-1):
#注意j值的越界问题
for j in range(len(lista)-1):
#如果前一个数大于后一个数,交换两数位置
if lista[j]>lista[j+1]:
lista[j],lista[j+1]=lista[j+1],lista[j]
else:
pass
print(lista)
推理过程
第一轮
[34,19,20,30,10,5,88,9]
[19,34,20,30,10,5,88,9]----------如果第一个数大于第二数,交换两数位置
[19,20,34,30,10,5,88,9]----------如果第二个数大于第三数,交换两数位置
[19,20,30,34,10,5,88,9]----------第三数大于第四数,交换两数位置
[19,20,30,10,34,5,88,9]
[19,20,30,10,5,34,88,9]
[19,20,30,10,5,34,88,9]
[19,20,30,10,5,34,9,88]------------第一轮交换结束
进行第二轮,进行比较。进行指定的轮数后,排序结束,退出程序
时间复杂度
O(n^2)
变种的代码实现
lista = [34,19,20,30,10,5,88,9]
for i in range(len(lista)-1):
for j in range(i+1,len(lista)):
#第i个元素跟其后的元素进行比较,如果大于,交换两数位置
if lista[i]>lista[j]:
lista[i],lista[j]=lista[j],lista[i]
else:
pass
print(lista)
推理过程
第一轮
[34,19,20,30,10,5,88,9]--------第一元素与第二元素进行比较 交换位置
[19,34,20,30,10,5,88,9]---------第一元素与第三元素进行比较 不变
[19,34,20,30,10,5,88,9]----------第一元素与第四元素进行比较 不变
[10,34,20,30,19,5,88,9]---------第一元素与第五元素进行比较 交换位置
[5,34,20,30,19,10,88,9]---------第一元素与第六元素进行比较 交换位置
[5,34,20,30,19,10,88,9]---------第一元素与第七元素进行比较 不变
[5,34,20,30,19,10,88,9]---------第一元素与第八元素进行比较 不变
第一轮结束,开始第二轮
第二元素继续与其后元素继续比较。以此类推,直到代码的完成。