Python - 排序( 插入, 冒泡, 快速, 二分 )

插入排序

算法分析

两次循环, 大循环对队列中的每一个元素拿出来作为小循环的裁定对象

小循环对堆当前循环对象在有序队列中寻找插入的位置

性能参数

空间复杂度  O(1)

时间复杂度  O(n^2)

详细代码解读

import randomdef func(l):# 外层循环: 对应遍历所有的无序数据for i in range(1, len(l)):# 备份 取出数据temp = l[i]# 记录取出来的下标值pos = i# 内层循环: 对应从后往前扫描所有有序数据"""i - 1  >   从最后一个有序数据开始, 即无序数据前一位-1  >   扫描到下标 0 为止, 要包括第一个, 因此设置 -1 往后推一位-1  >   从后往前扫描"""for j in range(i - 1, -1, -1):# 若有序数据 大于 取出数据if l[j] > temp:# 有序数据后移l[j + 1] = l[j]# 更新数据的插入位置pos = j  # 对应所有有序数据比取出数据大的情况# 若有序数据 小于/等于  取出数据else:pos = j + 1break# 在指定位置插入数据l[pos] = tempif __name__ == '__main__':l = list(range(1, 13))random.shuffle(l)func(l)print(l)

简单实例

import randomdef foo(l):for i in range(1, len(l)):temp = l[i]pos = ifor j in range(i - 1, -1, -1):if temp < l[j]:l[j + 1] = l[j]pos = jelse:pos = j + 1breakl[pos] = tempreturn lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [12, 0, 4, 5, 6, 2, 11, 10, 8, 7, 3, 1, 9]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

冒泡排序

算法分析

两两比较, 每次比较出一个未排序队列的最大值,让只在队列右侧排列

两次循环, 大循环每次输出一个当前最大值. 

小循环进行具体的数值比对

性能参数

空间复杂度  O(1)

时间复杂度  O(n^2)

详细代码

"""
入学后, 第一次上体育课, 体育老师要求大家排队, 按照身高从低到高排队
获取全班 10 名同学的身高
""""""
外层循环大循环控制总循环次数                    
内层循环小循环控制如歌得出这个最大值计算大小, 然后彼此交换
"""import random"""
基础版
"""def func(l):# 外层循环: 走访数据的次数for i in range(len(l) - 1):# 内层循环: 每次走访数据时, 相邻对比次数for j in range(len(l) - i - 1):# 要求从低到高# 如次序有误就交换if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]# 遍历次数print("走访次数:", i + 1)"""
升级版
"""def foo(l):# 外层循环: 走访数据的次数for i in range(len(l) - 1):# 设置是否交换标志位flag = False# 内层循环: 每次走访数据时, 相邻对比次数for j in range(len(l) - i - 1):# 要求从低到高# 如次序有误就交换if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]# 发生了数据交换flag = True# 如果未发生交换数据, 则说明后续数据均有序if flag == False:break  # 跳出数据走访# 遍历次数print("走访次数:", i + 1)if __name__ == '__main__':l = list(range(1, 11))random.shuffle(l)print("排序前:", l)# func(l)
    foo(l)print("排序后:", l)

简单代码

import randomdef foo(l):for i in range(len(l) - 1):for j in range(len(l) - i - 1):if l[j] > l[j + 1] and j != len(l):l[j], l[j + 1] = l[j + 1], l[j]return lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [2, 3, 0, 7, 8, 11, 10, 6, 4, 5, 12, 1, 9]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

升级版代码

import randomdef foo(l):for i in range(len(l) - 1):flag = 1for j in range(len(l) - i - 1):if l[j] > l[j + 1] and j != len(l):l[j], l[j + 1] = l[j + 1], l[j]flag = 0if flag:breakreturn lif __name__ == '__main__':l = list(range(13))random.shuffle(l)print(l)  # [0, 9, 1, 3, 8, 12, 6, 5, 2, 7, 10, 11, 4]print(foo(l))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

快速排序

算法分析

首先任意取一个元素作为关键数据 ( 通常取首元素

然后将所有比他小的数据源放在其前面, 所有比它大的放在他后面

通过一次排序将要排序的数据分为独立的两部分

然后按照该方法再递归对两部分数据进行快速排序

性能参数

时间复杂度  O(nlogn)

空间复杂度  O(logn)

稳定性    不稳定

详细代码

# 快速排序
import randomdef quick(l):# 递归退出条件# 仅剩一个元素无需继续分组if len(l) < 2:return l# 设置关键数据a = l[0]# 找出所有比 a 大的数据big = [x for x in l if x > a]# 找出所有比 a 小的数据small = [x for x in l if x < a]# 找出所有与 a 相等的数据same = [x for x in l if x == a]# 拼接数据排序的结果return quick(small) + same + quick(big)if __name__ == '__main__':l = list(range(1, 25))random.shuffle(l)l = quick(l)print(l)

二分查找

算法分析

只能对有序队列进行查找, 利用和中间值进行对比, 然后基于判断将队列丢弃一半的方式

性能参数

时间复杂度  O(log2 n)
空间复杂度  O(1)

详细代码

"""
1. 切分成两部分,取中间值来判断
2. 如何定义下一次的范围:大于中间值, 在左侧找小于中间值, 在右侧找
3. 查找失败情况: 中间值 小于左端 或者 中间值 大于 右端
""""""
扑克牌 只取 黑桃 13 张, 用 1-13 表示, 将牌从小到大排序, 反面向上排成一排, 找到黑桃 6 的位置
""""""
l   原始数据
k     待查找数据
left    首元素下标值
right   尾元素下标值
""""""
递归方式实现
"""def func(l, k, left, right):# 递归退出条件if left > right:# 查找结束return -1# 获取中间元素对应下标值middle = (left + right) // 2# 对比中间元素 和 查找元素if l[middle] == k:return middleelif l[middle] > k:# 中间值 大于 查找值# 查找范围是 中分后的 左边部分# 左侧下标值不变, 右侧下标值变为 middle 前一位right = middle - 1return func(l, k, left, right)else:# 中间值 小于 查找值# 查找范围是 中分后的 右边部分# 左侧下标值变为 middle 后一位, 右侧下标值不变left = middle + 1return func(l, k, left, right)"""
循环方式实现
"""def foo(l, k):left = 0right = len(l) - 1while left <= right:mid = (left + right) // 2if l[mid] > k:right = mid - 1elif l[mid] < k:left = mid + 1elif l[mid] == k:return midreturn -1if __name__ == '__main__':# l = list(range(1, 14))# k = 8# right = len(l) - 1# res = func(l, k, 0, right)
l = list(range(1, 14))k = 10right = len(l) - 1res = foo(l, k)if res == -1:print("查找失败")else:print("查找成功, 第 %d 张拿到" % res)

简单代码

def foo(l, k):left = 0right = len(l) - 1while left <= right:mid = (left + right) // 2if l[mid] > k:right = mid - 1elif l[mid] < k:left = mid + 1elif l[mid] == k:return midreturn -1if __name__ == '__main__':l = list(range(13))print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]print(foo(l, 8))  # 8

总结

冒泡排序

重复走访所有要排序的数据,
依次比较每两个相邻的元素,
如果两者次序错误就交换
重复上面过程 直到没有需要被调换的内容为止

插入排序

将数据插入到已经有序的数据中, 从而得到一个新的有序数据

默认首元素自然有序, 取出下一个元素, 对已经有序的数据从后向前扫描

若扫描的有序数据大于取出数据, 则该有序数据后移

若扫描的有序数据小于取出数据, 则在该有序数据后插入取出数据

若扫描的所有的有序数据大于取出数据, 则在有序数据的首位插入取出数据

特点

数据只移动不交换, 优于冒泡

快速排序

首先任意取一个元素作为关键数据 ( 通常取首元素 )

然后将所有比他小的数据源放在其前面

(从小到大)所有比它大的放在他后面

通过一次排序将要排序的数据分为独立的两部分

然后按照该方法再递归对两部分数据进行快速排序

特点

每次若能均匀分组则排序速度最快, 但是不稳定

 

转载于:https://www.cnblogs.com/shijieli/p/10922566.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)

2014-02-0610325 0C# 檢舉文章 過年結束了&#xff0c;雖然還是學生所以其實還有兩個禮拜的假期&#xff0c;不過為了不讓自己發慌&#xff0c;趁著假期多利用充實自己&#xff0c;所以提早回到開工狀態&#xff0c;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features Match)

前言 轮廓是构成任何一个形状的边界或外形线。前面讲了如何根据色彩及色彩的分布&#xff08;直方图对比和模板匹配&#xff09;来进行匹配&#xff0c;现在我们来看看如何利用物体的轮廓。包括以下内容&#xff1a;轮廓的查找、表达方式、组织方式、绘制、特性、匹配。 查…

itcast-ssh-crm实践

分析 BaseDao 文件上传 转载于:https://www.cnblogs.com/hellowq/p/10209761.html

分类器大牛们

David Lowe&#xff1a;Sift算法的发明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源码OpenSift的作者&#xff0c;个人主页上有openSift的下载链接&#xff0c;Opencv中sift的实现&#xff0c;也是参考这个。 Koen van de Sande&#xff1a;作者给出了sift,densesift,co…

利用python脚本程序监控文件被修改

需求&#xff1a;利用python编写监控程序&#xff0c;监控一个文件目录&#xff0c;当目录下的文件发生改变时&#xff0c;实现有修改就发报警邮件 邮件使用QQ邮箱&#xff0c;需要开启smtp&#xff0c;使用手机发生短信&#xff0c;腾讯会给你发邮箱密码。如下所示&#xff1a…

Oracle RAC

环境如下&#xff1a; Linux操作系统&#xff1a;Centos 6.5 64bit &#xff08;这个版本的redhat 6内核等OS在安装grid最后执行root.sh时会出现crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

Activiti多人会签例子

Activiti中提供了多实例任务&#xff08;for-each&#xff09;将多实例应到到UserTask中可以实现会签功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

MySQL-ProxySQL中间件(一)| ProxySQL基本概念

目录 MySQL-ProxySQL中间件&#xff08;一&#xff09;| ProxySQL基本概念&#xff1a; https://www.cnblogs.com/SQLServer2012/p/10972593.htmlMySQL-ProxySQL中间件&#xff08;二&#xff09;| Admin Schemas介绍&#xff1a;https://www.cnblogs.com/SQLServer2012/p/109…

标签td设置隐藏(hidden)

这样设置这个td就不会被其他的td给挤掉了! 还有一种方法就是把tr标签的solid设置为0px 这个方法把td标签的left,right,bottom,top的边框的solid全部设置为0px;转载于:https://www.cnblogs.com/tranquilityMan/p/10972811.html

Windows Server 2008 NFS

打开Windows Server 2008的Dos运行窗口&#xff08;不是powershell&#xff09;&#xff0c;然后键入&#xff1a; servermanagercmd.exe -install FS-NFS-Services 安装完毕之后&#xff0c;就要把NFS的存贮映射到Windows Server 2008上某个盘符以供使用&#xff0c;但为了…

金融反欺诈模型----项目实战--机器学习

机器学习&#xff1a;从源数据清洗到特征工程建立谈金融反欺诈模型训练 本文旨在通过一个完整的实战例子&#xff0c;演示从源数据清洗到特征工程建立&#xff0c;再到模型训练&#xff0c;以及模型验证和评估的一个机器学习的完整流程。由于初识机器学习&#xff0c;会比较多的…

Win7下如何挂载NFS共享目录

NFS是Unix中广泛使用的文件共享协议&#xff0c;在Linux下得到了传承&#xff0c;使用简单&#xff0c;读写性能强大。过去Windows与Linux共享文件夹需要使用Samba&#xff08;CIFS&#xff09;协议&#xff0c;虽然定制性更高&#xff0c;但设置和使用都比较繁琐。Windows 7加…

ECharts 点击非图表区域的点击事件不触发问题

1. 通过 myChart.getZr().on(click, fn) 监听整个图表的点击事件&#xff0c;注册回调 myChart.getZr().on(click, () > {//拿到index即可取出被点击数据的所有信息console.log(clickIndex) }) 2. 在 tooltip 的 formatter 函数中&#xff0c;每次调用都记录下需要的参数&am…

强大的django-debug-toolbar,django项目性能分析工具

强大的django-debug-toolbar,django项目性能分析工具 给大家介绍一个用于django中debug模式下查看网站性能等其他信息的插件django-debug-toolbar 首先安装 pip install django-debug-toolbar 接下来在自己django项目中的settings中添加配置 INSTALLED_APPS [debug_toolbar,]M…

个人作业——软件工程实践总结

一、请回望暑假时的第一次作业&#xff0c;你对于软件工程课程的想象 1&#xff09;对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和…

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一、JConsole是什么 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器&#xff0c;可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole&#xff08;或者&#xff0c;它更高端…

java内存溢出分析工具:jmap使用实战

java内存溢出分析工具&#xff1a;jmap使用实战 在一次解决系统tomcat老是内存撑到头&#xff0c;然后崩溃的问题时&#xff0c;使用到了jmap。 1 使用命令 在环境是linuxjdk1.5以上&#xff0c;这个工具是自带的&#xff0c;路径在JDK_HOME/bin/下 jmap -histo pid>a.log…

JDK内置工具使用

JDK内置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status Tool) 三、jstack命令(Java Stack Trace) 四、jstat命令(Java Virtual Machine Statistics Monitoring Tool) 五、jmap命令(Java Memory Map) 六、jinfo命令…

Windows10系统下wsappx占用CPU资源过高?wsappx是什么?如何关闭wsappx进程?

在Windows10系统开机的时候&#xff0c;wsappx进程占用的CPU资源非常高&#xff0c;导致电脑运行速度缓慢&#xff0c;那么我们如何关闭wsappx进程&#xff0c;让电脑加快运行速度呢&#xff1f;下面就一起来看一下操作的方法吧。 【现象】 1、先来看一下电脑刚开机的时候&…

jvm02

java虚拟机内存管理 每个线程就是一个顺序的执行单元&#xff0c;线程共享区即多个线程共享同一块区域&#xff0c;线程独占区即每个线程都有自己的虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器。 程序计数器是一个比较小的内存空间&#xff0c;可以看作是当前线程所…