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