Python:数据结构及算法(2)——排序(1)

简单的排序算法:冒泡排序,插入排序,选择排序。
排序算法重要的是要分清楚已经排过序的有序区和未排序的无序区

冒泡排序

# 冒泡排序    将最大的比较排到最上边
def bubble_sort(lis):
    for i in range(len(lis)-1):  # i是第几趟
        exchange = False
        for j in range(len(lis)-i-1):
            if lis[j] > lis[j+1]:
                lis[j], lis[j+1] = lis[j+1], lis[j]
                exchange = True
        print(lis)  # 输出每趟排序后的结果
        if not exchange:
            return
测试
lis = [9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
print('未排序列表如下:')
print(lis)
print('排序过程如下:')
bubble_sort(lis)
print('排序后列表如下:')
print(lis)
结果
未排序列表如下:
[9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
排序过程如下:
[8, 5, 7, 2, 6, 3, 0, 4, 1, 9]
[5, 7, 2, 6, 3, 0, 4, 1, 8, 9]
[5, 2, 6, 3, 0, 4, 1, 7, 8, 9]
[2, 5, 3, 0, 4, 1, 6, 7, 8, 9]
[2, 3, 0, 4, 1, 5, 6, 7, 8, 9]
[2, 0, 3, 1, 4, 5, 6, 7, 8, 9]
[0, 2, 1, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
排序后列表如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

插入排序

# 插入排序     打扑克牌摸牌类似
def insert_sort(lis):
    for i in range(1, len(lis)):  # i表示摸到的牌
        j = i-1
        tmp = lis[i]
        while j >= 0 and lis[j] > tmp:
            lis[j+1] = lis[j]
            j -= 1
        lis[j+1] = tmp
        print(lis)
测试
lis = [9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
print('未排序列表如下:')
print(lis)
print('排序过程如下:')
insert_sort(lis)
print('排序后列表如下:')
print(lis)

结果
未排序列表如下:
[9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
排序过程如下:
[8, 9, 5, 7, 2, 6, 3, 0, 4, 1]
[5, 8, 9, 7, 2, 6, 3, 0, 4, 1]
[5, 7, 8, 9, 2, 6, 3, 0, 4, 1]
[2, 5, 7, 8, 9, 6, 3, 0, 4, 1]
[2, 5, 6, 7, 8, 9, 3, 0, 4, 1]
[2, 3, 5, 6, 7, 8, 9, 0, 4, 1]
[0, 2, 3, 5, 6, 7, 8, 9, 4, 1]
[0, 2, 3, 4, 5, 6, 7, 8, 9, 1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
排序后列表如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

选择排序

# 选择排序   选一个最小的放到第一个
def select_sort(lis):
    for i in range(len(lis)-1):  # i表示第几趟
        min_loc = i
        for j in range(i, len(lis)):
            if lis[min_loc] > lis[j]:
                lis[j], lis[min_loc] = lis[min_loc], lis[j]
        print(lis)
运行
lis = [9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
print('未排序列表如下:')
print(lis)
print('排序过程如下:')
select_sort(lis)
print('排序后列表如下:')
print(lis)
结果
未排序列表如下:
[9, 8, 5, 7, 2, 6, 3, 0, 4, 1]
排序过程如下:
[0, 9, 8, 7, 5, 6, 3, 2, 4, 1]
[0, 1, 9, 8, 7, 6, 5, 3, 4, 2]
[0, 1, 2, 9, 8, 7, 6, 5, 4, 3]
[0, 1, 2, 3, 9, 8, 7, 6, 5, 4]
[0, 1, 2, 3, 4, 9, 8, 7, 6, 5]
[0, 1, 2, 3, 4, 5, 9, 8, 7, 6]
[0, 1, 2, 3, 4, 5, 6, 9, 8, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 9, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
排序后列表如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值