【算法】冒泡排序

#第一次,找到最大值

n=[3,5,1,6,2]

for i in range(len(n)-1):

    if n[i]>n[i+1]:

        n[i],n[i+1]=n[i+1],n[i]

print (n[-1])

#第二次,找到次大值,放在倒数第二的位置

n=[3,1,5,2,6]

for i in range(len(n)-1-1):

    if n[i]>n[i+1]:

        n[i],n[i+1]=n[i+1],n[i]

print (n[-2])

#第三次,找第三个最大数

n=[1,3,2,5,6]

for i in range(len(n)-1-1-1):

    if n[i]>n[i+1]:

        n[i],n[i+1]=n[i+1],n[i]

print (n[-3])

#第四次,找第四个最大数

n=[1,2,3,5,6]

for i in range(len(n)-1-1-1-1):

    if n[i]>n[i+1]:

        n[i],n[i+1]=n[i+1],n[i]

print (n[-4])

#冒泡排序最终

a= [3,5,1,6,2]

for i in range(len(a)-1):           #0,1,2,3

    for j in range(len(a)-1-i):      #4-0;4-1;4-2;4-3

        if a[j]>a[j+1]:

            a[j],a[j+1] = a[j+1],a[j]

print(a)

第一次内层循环的结果就是找到最大的值

第二次内层循环的结果就是找到次大的值,本次将忽略最后一个元素的比较

第二次内层循环的结果就是找到第三大的值,本次讲忽略倒数第二个元素和最后一个元素的比较

.......

1、冒泡排序图示

 

#练习:在上面排序的基础上,将最小的放在后面,最大的放在前面

a= [3,2,1,9,56,48,20,4,9,6,0]

for i in range(len(a)-1):      

    for j in range(len(a)-1-i):    

        if a[j]<a[j+1]:

            a[j],a[j+1] = a[j+1],a[j]

print(a)

或者直接

a= [3,2,1,9,56,48,20,4,9,6,0]

for i in range(len(a)-1):         

    for j in range(len(a)-1-i):   

        if a[j]>a[j+1]:

            a[j],a[j+1] = a[j+1],a[j]

print(a[::-1])

2、冒牌排序原理

冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序

3、冒泡算法的时间复杂度

时间复杂度从小到大的排序顺序为:

常数阶O(1),对数阶O( log n ),线性阶O(n),平方阶O(n^2),立方阶O(n^3),...,k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。也就是:
O(1) < O(logn) < O(n) < O(nlogn)<O(n^2) < O(n^3) <…< O(n^k)<O(2^n) <O(n!)

对于算法来讲,只看影响最大的那个因子是什么(怎么判断哪个因子是影响最大的?),一般忽略分母,不看分母

#练习:计算冒泡排序的时间复杂度

遍历第1遍时,比较了n-1次;

遍历第2遍时,比较了n-2次;

遍历第3遍时,比较了n-3次;

遍历第4遍时,比较了n-4次;

……….

遍历第n-1遍时,比较了1次;

综上,总共比较的次数为1+2+3+4+….+(n-1)=n(n-1)/2次

因为,n(n-1)/2=n^2/2-n/2

所以,他的时间复杂度为O(n^2)

原文地址:https://www.cnblogs.com/jingsheng99/p/9608028.html