700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python版 常用排序算法 思路加详解 冒泡排序 快速排序 插入排序 选择排序

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

时间:2022-02-03 09:57:03

相关推荐

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)) # 排序一下,输出结果

二、快速排序

思路:

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

步骤:

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

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

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

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

代码:

def qs(n):if len(n) < 2: # 列表中的元素必须大于等于2才能比,小于2就比不了,直接返回列表return nelse: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位上的数大于bl[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 nprint(f([6,5,6,1,326,83,9,2]))

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。