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 n
print(f([6,5,6,1,326,83,9,2]))
好啦,今天的文章就到这里了,有什么问题评论区或者私信找我,有什么好的建议也可以说。欢迎三连,点赞、收藏、关注
python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序相关推荐
- 冒泡排序 快速排序 插入排序 选择排序
最近面试好多公司考察算法,特意整理了一下: 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻 ...
- php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...
PHP 常见算法[冒泡排序, 快速排序, 插入排序, 选择排序, 二分法查找, ..] // 冒泡排序 function bubblesort($arr) { for($i=0,$j=count($a ...
- 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树
文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...
- c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...
- 归并排序java_Java经典排序算法之归并排序详解
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...
- 万字总结八大排序算法(图文详解)
目录 一.冒泡排序 基本思想: 主要思路: 二.选择排序 基本思想: 主要思路: 三.插入排序 基本思想: 主要思路: 插入排序优化: 四.希尔排序 基本思想: 思路步骤: 代码示例: 对于希尔排序稳 ...
- 7-35 城市间紧急救援 (25 分)(思路加详解)
一:题目 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城 ...
- JavaScript实现十大排序算法(图文详解)
冒泡排序 排序的效果图 解法 当前解法为升序 冒泡排序的特点,是一个个数进行处理.第i个数,需要与后续的len-i-1个数进行逐个比较. 为什么是 `len-i-1`个数? 因为数组末尾的i个数,已经 ...
- 选择排序算法与示例详解(c语言)
选择排序是排序算法的一种,思想就是,每一轮寻找数组中最大的值或者最小的值,放在头部或者放入一个新的数组.这样经历一轮遍历,数组或者新数组就是排好序的,他的目的很明确,每次找最大值或者最小值. 这个放在 ...
最新文章
- Python之迭代器和生成器(Day17)
- JS中定义式函数与变量时函数的差别
- Oracle 数据库修改配置文件sga_target参数的值,sga_target值太小导致数据库服务起不来问题解决,调大sga_target参数方法
- leetcode-简单题-题序:9+13
- 90后实习生,是如何成长为阿里云分布式NoSQL领域专家
- webrtc 渲染_[WebRTC架构分析]采样率转换
- 华为 5G、阿里检测病毒算法、腾讯 AI 一分钟诊断,国内抗疫科技大阅兵!
- js中两种定时器,setTimeout和setInterval的区别
- extern dllInport用法
- 【数位dp】HDOJ2089:不要62( 真· 数位dp入门题目)
- PR视频旋转处理方法
- SSM项目实战 —— 物流管理系统的实现
- 《C++新经典》第17章 并发与多线程
- java mat转成二维数组_opencv二维数组转mat
- 应急响应-文件痕迹排查
- esp32测试wifi速率
- @SpringBootTest与@RunWith注解的区别
- 信息安全等级合规测评
- QQ虎年春节活动ADB自动助手(自动开星星,自动红包雨下拉,自动团圆饭,自动一笔连)
- 科视激光投影和多媒体系统在上海天文馆与你相约浩瀚宇宙
热门文章
- CAD怎么快速用计算机加面积,建筑设计中如何快速完成面积统计?看这里
- 昨天晚上11点半看到凌晨2点半,看了lost《迷失》
- win10桌面背景图片、更新锁屏图片在哪个文件夹
- ironbot智能编程机器人_智能编程机器人-IronBot!_硬件测评心得_ZNDS
- android 闪屏拉伸,App设计体系之引导页/启动页/闪屏
- Python大作业数据(个人所需)
- 用Unity做“吃鸡”需要注意什么
- mysql查询姓名第二个字_mysql数据库(二)——表的查询
- 毕业设计1-开题报告
- vue跨域下载文件替换文件名