算法--冒泡排序

算法关键点:

  无序区

  有序区

冒泡排序

列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数……(升序,大的放后面)

 代码关键点:

  • 无序区 (红色表示有序去,白色表示无序区)

python代码实现:

li = [9, 2, 3, 4, 5, 6, 7, 8, 1]


def foo(li):
    for i in range(len(li) - 1):  # 列表长度-1 趟; i 表示第几趟
        for j in range(len(li) - i - 1):  # 无序区的长度 -1; j 表示当前索引,要和后面的j+1索引比较
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]


foo(li)
print(li)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

 时间复杂度:O(n2)

优化:如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

def foo(li):
    for i in range(len(li) - 1):
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j + 1]:  # 循环一遍,前面的值都小于后面,说明已经排好了,就执行下面的return
                li[j], li[j + 1] = li[j + 1], li[j]
                exchange = True
        if not exchange:
            return

Python的速度 10的7次方 (千万)

C语言大约是Python的10倍

100002次运算次数 Python用时10秒左右, C用1秒左右

原文地址:https://www.cnblogs.com/zhzhlong/p/12891193.html