排序(2)

今天来看一下标准的冒泡排序。首先定义一个交换位置的函数swap,放在swap.py

#定义交换位置的函数
def swap(L, i, j):
    t = L[i]
    L[i] = L[j]
    L[j] = t
    return L

接下来是冒泡排序算法(python)

from swap import swap
def BubbleSort1(L):
    for i in range(0, len(L)):
        for j in range(len(L) - 2, i - 1, -1):
            if L[j] > L[j + 1]:
                L = swap(L, j, j + 1)
    return L

注意第二个for循环中,len(L) - 2 是指列表的倒数第二个数字,由于range()函数是前闭后开的,因而后面应该是i-1。比如当i=2时,j应该是在len(L)-2到2 之间,当j变为2时, 是L[2]和L[3]比大小,并交换位置,而此时的L[0]和L[1]都位于正确的位置,不需要比较了。过程如下:(下图来自《大话数据结构》)


但是仔细考虑有个问题,比如当i = 2时,j从Len(L)到2都没有发生交换,也就是说前一次循环已经使得列表有序,之后的循环实际都不需要了,因而改进如下,方法是添加一个flag标记


#改进的冒泡排序
def BubbleSort2(L):
    for i in range(0, len(L)):
        flag = False                   
        for j in range(len(L) - 2, i - 1, -1):
            if L[j] > L[j + 1]:
                L = swap(L, j, j + 1)
                flag = True
        if not flag:
            break
    return L

与前面的区别是这里多了一个布尔变量flag,并对flag进行了判断。在每次进入第一个for loop 时,初始化flag为False,如果交换,则flag赋值为True,在第二个for loop结束后 对flag的值进行判断,若为False ,则说明没有发生交换,列表已经有序,退出for loop,结束程序。

冒泡排序的时间复杂度为O(n2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值