今天来看一下标准的冒泡排序。首先定义一个交换位置的函数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]都位于正确的位置,不需要比较了。过程如下:(下图来自《大话数据结构》)

排序(2)

但是仔细考虑有个问题,比如当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)

相关文章:

  • 2021-07-25
  • 2022-01-20
  • 2021-10-20
  • 2021-07-28
  • 2021-09-12
  • 2022-01-02
  • 2021-12-04
  • 2021-08-28
猜你喜欢
  • 2022-12-23
  • 2021-12-27
  • 2021-07-26
  • 2021-05-01
  • 2021-10-04
  • 2021-08-05
  • 2022-01-18
相关资源
相似解决方案