python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序

注:这里所有排序操作都以从小到大排列为例,想要从大到小排的自行修改代码即可

目录

一、冒泡排序

思路:

步骤:

解析:

二、快速排序

思路:

步骤:

代码:

 三、插入排序

思路:

代码:

四、选择排序

思路:

步骤:

代码:


一、冒泡排序

思路:

如果一个数比它右边的大,就交换它们,一直交换直到最后一个元素也经历过交换了,这时列表的最后一个元素就是这个列表里最大的,就固定住它,不用再让其它数跟它比较了。这称为一次排序,一共会进行列表长度-1次排序,不信可以自己动手试试,动手在纸上自己操作乃代码成功之母

一个小动图:

步骤:

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3、针对所有的元素重复以上的步骤,除了最后一个。

4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

解析:

def bs(n):   # 定义一个实现冒泡排序的函数 
    for i in range(1, len(n)):  # 一共要运行列表的长度-1次,这里也为下边行了个方便,每一次i的取值都是队尾确定的元素个数+1 为什么这样后边说
        for j in range(0, len(n)-i):  # 每一次要去掉队尾的确定的i个元素。

#因为后续j要加1,为了避免索引号超出列表长度的范围,我们就多减一个1。
#有人说因为range会要头不要尾所以1减多了,不对的,j要变成索引号,所以没多减哦
            if n[j] > n[j+1]:  # 如果这个数大于它右边的
                n[j], n[j + 1] = n[j + 1], n[j]  # 它俩交换位置
    return n  # 最后返回
n=[6,5,6,1,326,83,9,2]  # 定义一个乱序列表
print(bs(n))  # 排序一下,输出结果
    

二、快速排序

思路:

快速排序就是设一个基准值,把所有比它小的放到它左边,比它大的放到它右边,再在左边和右边进行相同的操作,直到都排完了,就把排好的左边和基准值和排好的右边串成一个列表,返回即可

步骤:

  1. 从数列中挑出一个元素,称为基准值

  2. 重新排序数列,所有元素比基准值小的摆放在基准值前面,所有元素比基准值大的摆在基准值的后面(相同的数可以到任一边,这里我放到了左边)。

  3. 递归地(recursive)把小于基准值元素的数列和大于基准值元素的数列排序

  4. 组合成一个列表,返回结果

代码:

def qs(n):
    if len(n) < 2:  # 列表中的元素必须大于等于2才能比,小于2就比不了,直接返回列表
        return n
    else:
        b = n[0]  # b为基准值
        xyb = [i for i in n[1:] if i <= b]  # 这里偷了个小懒,用了个列表表达式,小于等于b的放到这个列表里
        dyb = [i for i in n[1:] if i > b]  # 大于b的放到这个列表里
        return qs(xyb) + [b] + qs(dyb)  # 返回合并后的列表
print(qs([1,3,6,1,2,9,44,4,2,6,4,8]))  # 测试一下,返回结果正确!

 三、插入排序

思路:

插入排序就是一个数,一直往前闯,前方的数只要比它大它就闯过去,一直闯闯闯,闯到比它小的它就停,这一个数就算完事了。然后下一个数再闯.........

小动图:

代码:

def f(l):
    for i in range(len(l)):
        a = i-1  # a就是坐标的前一位
        b = l[i]  # b就是i坐标的值
        while a >= 0 and l[a] > b:  # 如果a在索引号范围之内,然后a位上的数大于b
            l[a+1] = l[a]  # 把a数往后挪,给b腾地方
            a-=1 # 往前走,b一直要跟前一个数比较
        l[a+1] = b  # 把b落下来
    return l  # 最终返回结果
l=[1,5,6,1,326,83,9,2]
print(f(l))

四、选择排序

思路:

每次都在未排序的序列中找最小的,找的过程就是:找一个基准值,比基准值小就让基准值等于它。找完最小的就把它放到排完的序列里,后来的就依次放在末尾

小动图:

步骤:

1、首先在未排序序列中找到最小元素,存放到排序序列的起始位置。

2、再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。

3、重复第二步,直到所有元素均排序完毕。

代码:

def f(n):
    for i in range(len(n)-1):
        k = i  # 一个标记,代表最小数的索引
        for j in range(i+1, len(n)):  # 找未排序序列中的最小数
            if n[j] < n[k]:  # 如果k索引代表的数不是最小数
                k = j  # k就去等于新最小数的索引号
        if i != k:  # i不是最小数时,将i和最小数进行交换
            n[i], n[k] = n[k], n[i]
    return n
print(f([6,5,6,1,326,83,9,2]))

好啦,今天的文章就到这里了,有什么问题评论区或者私信找我,有什么好的建议也可以说。欢迎三连,点赞、收藏、关注

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值