算法-列表排序(冒泡、选择、插入)

排序-冒泡

bubble_sort方法:
1.列表相邻两个数,前面若比后面的大,则交换两个数
2.一趟过后,最后一个数是最大的,为有序区,则未排序区域减少一个数
简单粗暴法:时间复杂度:O(n²)

def bubble_sort(li):
    for i in range(len(li) - 1):  # i趟
        for j in range(len(li) - 1 - i):  # 每一趟比较无序的区域,第i趟会产生i个有序的数
            if li[j] > li[j + 1]:  # 当前数和后一个做对比
                li[j], li[j + 1] = li[j + 1], li[j]
                
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
bubble_sort(li)
print(li)

优化(能省则省):

def bubble_sort(li):
    for i in range(len(li) - 1):  # i趟
        exchange = False  # 表示本趟是否操作排序
        for j in range(len(li) - 1 - i):  # 每一趟比较无序的区域,第i趟会产生i个有序的数
            if li[j] > li[j + 1]:  # 当前数和后一个做对比
                li[j], li[j + 1] = li[j + 1], li[j]
                exchange = True
        if not exchange:
            return  # 如果当前趟内每个数的对比发现没有移动,则已完成排序


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

排序-选择

select_sort方法:
1.将每趟排序最小的数取出来,放到第一个位置,这部分是已经选出的有序区
2.然后继续在无序区中取最小的数继续放到下一个位置,依次排序

简单粗暴的选择排序:时间复杂度O(n³)
不推荐:使用两个列表占用资源

def select_sort(li):
    li_new = []
    for i in range(len(li)):
        min_value = min(li)
        li_new.append(min_value)
        li.remove(min_value)
        # li_new.append(li.pop(li.index(min_value)))  #pop移除也可以
    return li_new


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

优化:时间复杂度O(n²)
选择出的最小值跟无序区第一个位置进行交换

def select_sort_new(li):
    for i in range(len(li) - 1):
        min_loc = i
        for j in range(i + 1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]


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

排序-插入

inser_sort方法:
1.每次从无序区拿出一个值
2.放到有序区对应位置

def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        # j是列表第0位,拿i列表第1位,两个数据做比较
        while j >= 0 and li[j] > tmp:
            li[j + 1] = li[j]
            j -= 1
        li[j + 1] = tmp


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

总结

上述均为原地排序,时间复杂度均为O(n²)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值