算法1: 冒泡 插入 选择 希尔

冒泡排序:

冒泡排序就是两个for 循环的嵌套, 外部循环每循环一次,就可以找到该列表中最小或最大的一个数据,
内部循环每循环一次只做两个相邻的数据对比
如何将这个数据放到它 排序对应的位置, 如: 我是从小到大进行排序的, 那么,我外部第一次循环结束就可以得到整个列表中最小的值
如何将它放到下标为0的位置

lists = [42, 16, 84, 12, 77, 26, 53, 84, 10, 11, 12, 77, 42, 42]

for i in range(len(lists)):
    for j in range(len(lists)-1):
        if lists[j] > lists[j+1]:

            lists[j], lists[j+1] = lists[j+1], lists[j]

内部循环是以外部循环的位置+1当做起点,与外部循环 i 数据进行对比

插入排序:

插入就是比较当前循环到的数据和上一个数据进行对比, 如果当前的数据大于上一个的数据,那么就进行位置调换
一直循环比较到 下标为 0 的位置或当前的数据小于上一个位置的数据

当前代码是从大到小排序

def run(li):
    for i in range(1, len(li)):
        while i > 0:
            # 判断当前循环到的列表下标的值是否大于当前下标-1 的值,如果大于,则会换位置,
            if li[i] < li[i - 1]:
                li[i], li[i - 1] = li[i - 1], li[i]
                # 换完位置后将当前下标-1设置为换位置后的数据,让第二次while循环判断,如果i-1=0了,则证明
                # 当前的这位数是当前for循环中遇到的最大的数了,就可以结束 while 循环了
                i -= 1
            # 如果不大于则结束当前while 因为不需要再判断了
            else:
                break

希尔排序:

在这里插入图片描述
在这里插入图片描述

希尔排序就是一个更高级的插入排序, 它对比的数据不是连续的,通过拆分数据将数据进行对比,这样的好处比插入排序更有效的是在
如果列表中最后一个数据是要放到最前面的时候,插入排序就需要依次循环完整个列表才能将最后这个数据放到最前面, 而希尔排序是
隔着几个数据进行比较的,这样就不会出现插入排序这种情况

def shell_sort(alist):
    n = len(alist)
    gap = n // 2
    while gap >= 1:
        for j in range(gap, n):
            i = j
            while i - gap >= 0:
                if alist[i] < alist[i - gap]:
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    i -= gap
                else:
                    break
        gap //= 2

选择排序:

选择排序就是在外部定义一个记录当前列表最大或最小值的下标,如 index 然后内部for循环结束后就可以得到当前循环的列表中的最大或最小值的下标,
然后将它放到对应的位置, 如,外部循环是调用次的时候,i 的值是 0,然后将记录好的下标的数据进行调换
lists[i], lists[index] = lists[index], lists[i]

lists = [42, 16, 84, 12, 77, 26, 53, 84, 10, 11, 12, 77, 42, 42]

for i in range(0, len(lists)):
    nums = i
    for j in range(i+1, len(lists)):
        if lists[j] > lists[nums]:
            nums = j
    lists[i], lists[nums] = lists[nums], lists[i]

冒泡和选择挺像的,外部for循环一次都可以获取最大或最小值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值