基础算法之冒泡排序算法

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

以随机产生的五个数为例: li=[354,405,469,82,345]
冒泡排序是怎么实现的?
首先先来个大循环,每次循环找出最大的数,放在列表的最后面。在上面的例子中,第一次找出最大数469,将469放在最后一个,此时我们知道
列表最后一个肯定是最大的,故还需要再比较前面4个数,找出4个数中最大的数405,放在列表倒数第二个......

5个数进行排序,需要多少次的大循环?? 当然是4次啦!同理,若有n个数,需n-1次大循环。

现在你会问我: 第一次找出最大数469,将469放在最后一个??怎么实现的??
嗯,(在大循环里)用一个小循环进行两数比较,首先354与405比较,若前者较大,需要交换数;反之不用交换。
当469与82比较时,需交换,故列表倒数第二个为469;469与345比较,需交换,此时最大数469位于列表最后一个啦!

难点来了,小循环需要多少次??

进行两数比较,从列表头比较至列表尾,此时需len(array)-1次!! 但是,嗯,举个例子吧: 当大循环i为3时,说明此时列表的最后3个数已经排好序了,不必进行两数比较,故小循环需len(array)-1-3. 即len(array)-1-i

代码如下:

>>> def bubble(array):
    for i in range(len(array)-1):
     exchange = False
for j in range(len(array)-i-1): if array[j] > array[j+1]: array[j],array[j+1] = array[j+1],array[j]
          exchange = True
     if not exchange:
        break
>>> array = [3,4,42,9,1] >>> bubble(array) >>> print(array) [1, 3, 4, 9, 42]

注:这里进行了一步优化,加入了一个exchange判断符,如果exchange是False,说明剩下未排列的那些数据没有进行过交换,也就是说已经全部排序完成

冒泡排序复杂度: 

时间复杂度: 最好情况O(n), 最坏情况O(n^2), 平均情况O(n^2)

转自http://www.cnblogs.com/0zcl/p/6664809.html

posted @ 2018-03-25 22:11  嶙羽  阅读(243)  评论(0编辑  收藏  举报