14.数据结构——冒泡排序(笔记)

冒泡排序

       冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序的分析

交换过程图示(第一次):
在这里插入图片描述

那么我们需要进行n-1次冒泡过程,每次对应的比较次数如下图所示:
在这里插入图片描述
比如图中9个数排序,第一次需要比较8次即可,而第二次,只有8个数排序,所以需要比较7次即可,以此类推。
代码实现:

def bubble_sort(alist):
    for j in range(len(alist)-1,0,-1):
        # j表示每次遍历需要比较的次数,是逐渐减小的
        count=0
        for i in range(j):
            if alist[i] > alist[i+1]: 
                alist[i], alist[i+1] = alist[i+1], alist[i]    #交换数据
                count+=1
        if 0==count:
        	break

li = [54,26,93,17,77,31,44,55,20]
bubble_sort(li)
print(li)

       由上文第二图可以看到,我们需要重复进n-1轮比较,而每一轮比较的次数也是随着比较轮数的增加而递减。从图中可以到pass和comparison刚好是倒过来的。
       所以,对于某一轮的循环比较可以是
for i in range(j): ,但是随着轮数的增加,j是不断减小的。对于循环比较轮数,
for j in range(len(alist)-1,0,-1): 第一个参数是列表长度n减去1,因为每一轮的比较次数是递减,所以这里用倒序。
       这里做了一个优化,当要排的序列已经是按到要求排好了的,比如是按小到大排列好的,我们的大循环只需要进行一次即可(比较一轮既可)。只要当第一轮比较的时候,发现交换次数为0 ,说明序列是排列好的直接break跳出大循环。这样优化是的最优时间复杂度为O(n).

时间复杂度

在这里插入图片描述
最坏的情况下,两for循环都全部进行,一个循环是n,两个是O(n*n),由于当两个数相等未进行交换,所以相等的两个数前后顺序没有改变,算法是稳定的。

冒泡排序的演示

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读