冒泡排序

#冒泡排序:从第一个元素开始,每两个元素进行比较,当第一个元素大于第二个元素,两个元素位置交换,否则不变,全部比较之后整个元素中最大的元素就找到了

a=[3,5,1,7,2,8,3,9,0]
分析:
第一步:3>5不成立,3,5位置不变--->>[3,5,1,7,2,8,3,9,0]

第二步:5>1成立,5,1位置交换--->>[3,1,5,7,2,8,3,9,0]

第三步:5>7不成立,5,7位置不变--->>[3,1,5,7,2,8,3,9,0]

第四步:7>2成立,7,2位置交换--->>[3,1,5,2,7,8,3,9,0]

第五步:7>8不成立,7,8位置不变--->>[3,1,5,2,7,8,3,9,0]

第六步:8>3不成立,8,3位置交换--->>[3,1,5,2,7,3,8,9,0]

第七步:8>9不成立,8,9位置不变--->>[3,1,5,2,7,3,8,9,0]

第八步:9>0成立,9,0位置交换--->>[3,1,5,2,7,3,8,0,9]

'''

#找到一个最大的元素:

for j in range(len(a)-1):
    if a[j]>a[j+1]:
        a[j],a[j+1] = a[j+1],a[j]
    print(a)

print("****")
print(a)

E:>py -3 a.py
[3, 5, 1, 7, 2, 8, 3, 9, 0]
[3, 1, 5, 7, 2, 8, 3, 9, 0]
[3, 1, 5, 7, 2, 8, 3, 9, 0]
[3, 1, 5, 2, 7, 8, 3, 9, 0]
[3, 1, 5, 2, 7, 8, 3, 9, 0]
[3, 1, 5, 2, 7, 3, 8, 9, 0]
[3, 1, 5, 2, 7, 3, 8, 9, 0]
[3, 1, 5, 2, 7, 3, 8, 0, 9]
****
[3, 1, 5, 2, 7, 3, 8, 0, 9]

#找到倒数第二大的元素:

重复上面的逻辑到N-1步:---->>[3, 1, 5, 2, 7, 3, 8, 0, 9]最后一个位置已经找到了列表中的最大元素,下次比较的时候可以把该元素剔除比较

#找到倒数第三大的元素:

重复上面的逻辑到N-2步:---->>[1, 3, 2, 5, 3,7, 0, 8, 9]倒数第二个位置已经找到了倒数第二大的元素,下次比较的时候可以把倒数第二大元素剔除比较

。。。。以此类推,每次循环剔除最后一个元素即可

代码实现:

for i in range(len(a)):
    for j in range(len(a)-1-i):   #里层循环每次循环剔除一个元素,即-i
        if a[j]>a[j+1]:
            a[j],a[j+1] = a[j+1],a[j]  #如果前一个元素大于后一个元素则交换两个元素
        #print(a)


print("****")
print(a)

E:>py -3 a.py
****
[0, 1, 2, 3, 3, 5, 7, 8, 9]

时间复杂度计算:

当我们遍历第1遍时,比较了n-1(第一个元素本身不用跟自己比较,所以是n-1)次,把最大的数排在了x[n-1]的位置;

第2遍比较了n-2次,把第二大的数排在了x[n-2]的位置;

............

第n-1遍比较了1次,把倒数第二大的数排在了x[1]的位置。

这样,我们总共比较的次数是1+2+3+...+(n-1) = n(n-1)/2

在计算时间复杂度时,我们一般使用的大表示法,其时间复杂度,从小到大的排序是:

(1)<(logn)<(n)<(nlogn)<(n^2)<...<(2^n)<(n!)

我们上面所求得的n(n-1)/2,其时间复杂度,最大的影响因子是n^2,故其时间复杂度是(n^2)

原文地址:https://www.cnblogs.com/wenm1128/p/11765154.html