一、基本思想

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

图片说明:

冒泡排序python升序排列 冒泡排序代码python_排序算法

二、代码实现

代码:

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)

运行结果:

冒泡排序python升序排列 冒泡排序代码python_python_02

上述代码是最基本的冒泡排序方法,比较耗时耗力。如果比较数字数目较大并且有一部分数字已经有序时,那么以上方法还是会对有序的数字进行比较排序,会加大时间消耗。假设需要比较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)

运行结果:

冒泡排序python升序排列 冒泡排序代码python_空间复杂度_03


**

三、冒泡排序总结

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