LowB三人组:冒泡排序&选择排序&插入排序 (特点:原地排序,复杂度O(n²))

冒泡排序:

'''
冒泡排序:时间复杂度O(n²)
相邻两个数比较
一趟冒一个最大(或最小)的数到最上面
每一趟无序区减少一个数,有序区增加一个数
'''

def bubble_sort(li):
    for i in range(len(li) - 1):  # 冒泡n-1次排序完成
        flag = False
        for j in range(len(li) - 1 - i):  # 每次冒泡比较的次数
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]
                flag = True
        if not flag:
            return

 选择排序:

'''
选择排序:时间复杂度O(n²)
分为无序区和有序区
假设列表长度为n,一共n-1个值跟无序区的值比较(最后一个值不用比了),比较n-1次
第一次拿列表第一个值和后面的值比较,找出最小的,跟索引0处的元素进行交换
第二次拿列表第二个值和后面的值比较,找出最小的,跟索引1处的元素进行交换
第三次拿列表第三个值和后面的值比较,找出最小的,跟索引3处的元素进行交换
...
第n-1次拿列表第n-1个值后面的值比较,找出最小的,跟索引n-1处的元素进行交换
这样下来,最后一个元素一定是最大的,就不管了
'''
li = [4, 5, 3, 6, 2, 7, 9, 8, 1]
def select_sort(li):
    for i in range(len(li)-1):   # 取一个元素进行比较,共n-1个元素要进行比较
        min_loc = i     # 标记本趟最小值的索引,初始值为i
        for j in range(i+1, len(li)):  # 每一趟的比较找出最小值,跟第一个值交换,下次只跟后面的值比较
            if li[min_loc] > li[j]:   # 有比min_loc小的,就替换min_loc
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]

 插入排序:

'''
插入排序:时间复杂度O(n²)
类似摸牌,先拿列表第一个元素在手里
从剩下的元素里依次取元素,依次跟手里的元素比较,
如果比手里元素小,就挪动手中元素位置。
最后把元素插入
'''
def insert_sort(li):
    for i in range(1, len(li)):  # i:摸到的牌的下标
        j = i - 1  # j:手里的最后一张牌的下标
        tmp = li[i]  # 用临时变量保存摸到的牌,因为移动位置会进行覆盖
        # 情况一:[2,4,6]  摸到3   j>=0
        # 情况二:[2,4,6]  摸到1   j=-1
        while j >= 0 and tmp < li[j]:  # 这个循环干的事情是挪动元素位置
            li[j + 1] = li[j]
            j -= 1
        li[j + 1] = tmp
原文地址:https://www.cnblogs.com/staff/p/11408521.html