Python实现经典排序算法 --冒泡排序

        看多许多人写的Python冒泡算法,实在不够简洁,复杂度为O(n^2)的算法已经对计算机不够友好,代码那么长,对程序员也不那么友好!这里我来总结一下经典排序算法冒泡排序的基本原理以及源代码。

        冒泡算法它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。对于一个序列长度为n的列表,需要让计算机比较多次,假设我们要做升序排列,最不利条件下,序列是以降序的方式进行排列,这里一般构建了两个循环,底层循环是比较相邻两个元素的大小,每次比较需要设置一个激活函数,用于判断两个元素的大小,如果前面的元素大于后面的元素,那么激活函数激活,完成两个元素位置的调换,并更新序列;这一个底层循环主要将序列中最大的元素找出来并排到末尾,还有前面n-1个数需要比较,故顶层循环要保证底层循环的次数要达到n次。

        代码奉上:

        

def bubblesort(list):
    if list!=None:
        if len(list)==1:
            pass
        else:
            for i in range(len(list)):
                for j in range(len(list)-1):
                    if list[j]>list[j+1]:
                        list[j],list[j+1]=list[j+1],list[j]
    print (list)
list1=[2,5,4,8,6,1,5]
bubblesort(list1)

out:list1=[ 2, 4, 5, 5, 6, 8]

为了说明原理,我将代码改进一下,展示一下每次底层循环的计算结果

def bubblesort(list):
    if list!=None:
        if len(list)==1:
            pass
        else:
            for i in range(len(list)):
                print('[',i,']')
                for j in range(len(list)-1):
                    if list[j]>list[j+1]:
                        list[j],list[j+1]=list[j+1],list[j]
                        print("'",list,"'")
                    else:
                        print("*",list,"*")
                print('"',list,'"')
    print (list)
list1=[2,5,4,8,6,1,5]
bubblesort(list1)
out:
[ 0 ]
* [2, 5, 4, 8, 6, 1, 5] *
' [2, 4, 5, 8, 6, 1, 5] '
* [2, 4, 5, 8, 6, 1, 5] *
' [2, 4, 5, 6, 8, 1, 5] '
' [2, 4, 5, 6, 1, 8, 5] '
' [2, 4, 5, 6, 1, 5, 8] '
" [2, 4, 5, 6, 1, 5, 8] "
[ 1 ]
* [2, 4, 5, 6, 1, 5, 8] *
* [2, 4, 5, 6, 1, 5, 8] *
* [2, 4, 5, 6, 1, 5, 8] *
' [2, 4, 5, 1, 6, 5, 8] '
' [2, 4, 5, 1, 5, 6, 8] '
* [2, 4, 5, 1, 5, 6, 8] *
" [2, 4, 5, 1, 5, 6, 8] "
[ 2 ]
* [2, 4, 5, 1, 5, 6, 8] *
* [2, 4, 5, 1, 5, 6, 8] *
' [2, 4, 1, 5, 5, 6, 8] '
* [2, 4, 1, 5, 5, 6, 8] *
* [2, 4, 1, 5, 5, 6, 8] *
* [2, 4, 1, 5, 5, 6, 8] *
" [2, 4, 1, 5, 5, 6, 8] "
[ 3 ]
* [2, 4, 1, 5, 5, 6, 8] *
' [2, 1, 4, 5, 5, 6, 8] '
* [2, 1, 4, 5, 5, 6, 8] *
* [2, 1, 4, 5, 5, 6, 8] *
* [2, 1, 4, 5, 5, 6, 8] *
* [2, 1, 4, 5, 5, 6, 8] *
" [2, 1, 4, 5, 5, 6, 8] "
[ 4 ]
' [1, 2, 4, 5, 5, 6, 8] '
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
" [1, 2, 4, 5, 5, 6, 8] "
[ 5 ]
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
" [1, 2, 4, 5, 5, 6, 8] "
[ 6 ]
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
* [1, 2, 4, 5, 5, 6, 8] *
" [1, 2, 4, 5, 5, 6, 8] "
[1, 2, 4, 5, 5, 6, 8]
可以看出,在执行第一次比较过程中,即i=0时,执行第一次底层循环,从第一个元素开始进行比较,list[0]<list[1],故激活函数选择不操作直接返回list并打印;紧接着第二个元素与第三个元素进行比较,list[1]>list[2],激活函数选择交换它们的位置,即4和5交换,返回修改后的list并打印;直到第四个元素,这个元素为list中最大的一个元素,即与后面元素进行比较后,都会更换位置并修改序列,到第六个元素为止,比较结束,这也是为什么底层循环次数只有n-1次,因为只发生了n-1次比较。至此,最大元素会放到最后,依次的我们得出第二大,第三大的元素直至所有排序完成,这里我们共完成49次运算,也就是7^2,故算法复杂度为O(n^2);


        

猜你喜欢

转载自blog.csdn.net/u011213419/article/details/80998769