一、基本思想
顾名思义,冒泡排序就像水中的气泡一样,气泡一层一层向上走,越靠近水面的气泡越大。
简单来说,冒泡排序就是从需要排序的n个数字元素的第一个数字开始,对数字进行两两比较,将两者中较大的数字向后移动。经过第一趟排序,共比较n-1次,整个数字元素中最大的数字将在整串数字末尾;经过第二趟排序,比较n-2次,第二大数字就会排在倒数第二位…
图片说明:

二、代码实现
代码:
a = list(map(int,input().split())) #输入一组数字,空格分隔
for i in range(len(a)-1):
#外层循环记录比较的趟数
for j in range(len(a)-i-1):
#内层循环来记录每一趟需要交换的次数(随着大数沉底,也就是随着趟数增加,每一趟比较次数减小)
if a[j] > a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
print(a)运行结果:

上述代码是最基本的冒泡排序方法,比较耗时耗力。如果比较数字数目较大并且有一部分数字已经有序时,那么以上方法还是会对有序的数字进行比较排序,会加大时间消耗。假设需要比较n个数字,上述代码循环体会固定执行(n-1)+(n-2)+…+3+2次。
所以针对以上问题进行优化,我们可以初始化一个标识变量order值为True,如果此次循化(这一趟)下来发生了交换,则为False;如果本趟没有发生交换,否则说明排序已完成,为False,则可以结束循环。
优化代码:
a = list(map(int,input().split()))
for i in range(len(a)-1):
order = True #用order来记录这一趟是否发生了数字交换
for j in range(len(a)-i-1):
if a[j] > a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
order = False #若发生交换,改变order变量的值
if order == True:
#若order值没有发生变化,则证明本趟没有数字交换,此时数列已经有序,break退出排序
break
print(a)运行结果:

**
三、冒泡排序总结
**
1️⃣时间复杂度:
最优时间复杂度,最差时间复杂度分析和平均时间复杂度均为 O(n^2)。
2️⃣空间复杂度:
最优的空间复杂度就是起始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是起始元素都是逆序排序的,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);
3️⃣稳定性:
稳定
















