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;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

G.点我

链接&#xff1a;https://ac.nowcoder.com/acm/contest/903/G 题意&#xff1a; X腿与队友到河北省来参加2019河北省大学生程序设计竞赛&#xff0c;然而这场比赛的题目难度实在是太高了。比赛开始一个小时后&#xff0c;X腿仍然没有做出一个题。这时候&#xff0c;X腿惊讶的发…

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

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

Android:IntentService的学习

在Android的四大组件中&#xff0c;Service排行老二&#xff0c;在Android中的主要作用是后台服务&#xff0c;进行与界面无关的操作。由于Service运行在主线程&#xff0c;所以进行异步操作需要在子线进行。为此Android为我们提供了IntentService。 IntentService是一个抽象类…

智能商业大会构造信息化交流平台

在快速发展的当今社会&#xff0c;所有事物都在日新月异地变化着&#xff0c;相较于过去的传统商业的变化速度&#xff0c;现今基于数据的互联网商业变化速度高出了一个量级&#xff0c;同时市场对于企业的应对速度也有了更高的要求&#xff0c;然而面对大体量的数据&#xff0…

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…

go 成长路上的坑(1)

一、先来看一段代码 package mainimport "fmt"type X struct{}func (x *X) test(){println("h1",x) } func main(){a : X{} a.test()(&X{}).test()(X{}).test() } 猜猜他的结果 二、揭晓答案 package mainimport "fmt"type X struct{}func (…

利用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…

好程序员web前端分享MVVM框架Vue实现原理

好程序员web前端分享MVVM框架Vue实现原理&#xff0c;Vue.js是当下很火的一个JavaScript MVVM库&#xff0c;它是以数据驱动和组件化的思想构建的。相比于Angular.js和react.js更加简洁、更易于理解的API&#xff0c;使得我们能够快速地上手并使用Vue.js。​1.什么是MVVM呢&…

HDU - 3516 Tree Construction

HDU - 3516 思路&#xff1a; 平行四边形不等式优化dp &#xff1a;&#xff09; 代码&#xff1a; #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc.h> using namespace std; #define y1 y11 #define fi first #define se…

各类总线传输速率

1. USB总线 USB1.1&#xff1a; -------低速模式(low speed)&#xff1a;1.5Mbps -------全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 -------高速模式(high speed)&#xff1a; 25~480Mbps US…

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 …

Django 【认证系统】auth

本篇内容 介绍Django框架提供的auth 认证系统 方法&#xff1a; 方法名 备注 create_user 创建用户 authenticate 登录验证 login 记录登录状态 logout 退出用户登录 is_authenticated 判断用户是否登录 login_required装饰器 进行登录判断 引入模块 from django.…

儿科常见疾病的中成药疗法

孩子感冒&#xff0c;分清寒热是关键——儿童风寒感冒和风热感冒的中成药内服外治法 儿童不养儿不知父母恩&#xff0c;每个人恐怕都只有自己做了父母&#xff0c;才能感受到父母的爱。婴幼儿正处于最初的发育期&#xff0c;抵抗力弱&#xff0c;有个感冒发烧的也是常有的事儿。…

物化视图

有个项目因为有比较多的查询汇总&#xff0c;考虑到速度&#xff0c;所以使用了物化视图。简单的把用到的给整理了下。先看简单创建语句&#xff1a;create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char( s…

为什么直接ping知乎的ip不能访问知乎的网站,而百度就可以?

结论&#xff1a; 简单的说&#xff0c;就是baidu有钱。 正文&#xff1a; 大型网站依靠自身稀稀落落的服务器很难满足网页“秒开”的用户需求&#xff0c;会加入CDN加速的队伍。 当用户访问 http://www.zhihu.com 时&#xff0c;域名解析到距离用户最近的CDN服务器的公网IP&am…

皮肤病

小偏方治百病/《国医绝学健康馆》编委会编.—重庆&#xff1a;重庆出版社&#xff0c;2010.3&#xff08;国医绝学健康馆&#xff09; 湿疹 苦参汤熏洗治阴囊湿疹方 苦参、蛇麻子中药各50克&#xff0c;混合后&#xff0c;在晚上煎汤&#xff0c;可直接放在脸盆中煎。煎好后&am…

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…