冒泡排序

1. 简介

1.1 概念

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

1.2 步骤

冒泡排序算法的运作如下:

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.3 分析
  • 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定
1.4 优化
  • 添加 flag 参数

  • 记录上次交换的位置

  • 鸡尾酒排序

    • 鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同之处在于从低到高排然后从高到低,而冒泡排序则仅从低到高去比较序列中的每个元素,可以得到比冒泡排序稍微好一点的效能。
    • 最差时间复杂度O(n^2)
    • 最优时间复杂度-如果序列在一开始已经大部分排列过的话,会接近o(n)
    • 平均复杂度-O(n^2)

2. 代码实例

def sort(a):
for i in range(len(a)-1, 0, -1):
    for j in range(i):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]

# 优化1: 添加标记flag, 如果内循环中的判断没有执行,表示已经数组是排序好的,直接退出循环即可
def sort_better1(a):
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True   #如果下面的循环中的判断没有执行,表示已经数组是排序好的,直接退出循环即可
        for j in range(i):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
        print(a)
        if flag:
            break

# 优化2:记录上次最后一次交换元素的位置,那么次位置之后的就是已经排序好的,下次遍历的时候就不需要再遍历此位置之后的元素
def sort_better2(a):
    last_position = len(a) - 1
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True
        index = 0
        for j in range(last_position):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
                index = j
        print(a)
        if flag:
            break
        last_position = index
# 优化3: 鸡尾酒排序  鸡尾酒排序,即双向的冒泡排序,等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低
#(有先后顺序,并非同时;大循环下第一个循环是从开始扫到结束,将最大的归到最后;第二个循环是从倒数第二个位置往开始端扫,将最小的归到开始的位置)        
def sort_better3(a):
    last_position = len(a) - 1
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True
        index = 0
        for j in range(last_position):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
                index = j
        last_position = index
        for k in range(last_position, 0, -1):
            print("k------" + str(k))
            if a[k] < a[k-1]:
                a[k], a[k-1] = a[k-1], a[k]
                flag = False
        print(a)
        if flag:
            break
  
li = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort(li)
print(li)
a = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better1(a)
#print(a)
b = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort_better2(b)
print(b)
c = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better3(c)
#print(c)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值