文章目录

  • 什么是顺序查找
  • 算法分析
  • 二分查找
  • 冒泡算法思路
  • 插入排序
  • 谢尔排序
  • 归并排序
  • 快速排序
  • 课程练习

什么是顺序查找

数据项保存在像列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。
在Python List中,这些数据项的存储位置称为下标,这些下标都是由序的整数。
通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”。

算法分析

1.要对查找算法进行分析,首先要确定其中的基本计算步骤。
2.回顾第二章算法分析的要点,这种基本计算步骤必须要足够简单,并且在算法中反复执行。
3.在查找算法中,这种基本计算步骤就是进行数据项的比对。(当前数据项等于还是不等于要查找的数据项,比对的次数决定了算法复杂度)

在顺序查找算法中,为了保证是讨论的一般情形,需要假定列表中的数据项并没有按值排列顺序,而是随即放置在列中的各个位置。(数据项在列表中各处出现的概率是相同的)

二分查找

二分查找算法实际上体现了解决问题的典型策略:分而治之。(显然递归算法是一种典型的分治策略算法,二分法也适用递归算法来实现)
将问题分为若干更小规模的部分,通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。

冒泡算法思路

冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位,经过n-1趟比较交换,实现整表排序。

插入排序

谢尔排序

列表越接近有序,插入排序的比对次数就越少,因此谢尔排序以插入排序作为基础,对无序表进行“间隔”划分列表,每个子列表都执行插入排序。

随着子列表的数量越来越少,无序表的整体越接近有序,从而减少整体排序的比对次数。

归并排序

归并排序是递归算法,思路是将数据表持续1分裂为两半,对两半分别进行归并排序。

归并排序分为两个过程:分裂和归并

快速排序

快速排序的思路是依据一个中值数据项来把数据表分为两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序(递归)。

快速排序的递归算法“递归三要素”:

快速排序过程分为两部分:分裂和移动
如果分裂总能把数据表分为相等的两部分,那么就是O(logn)的复杂度,算法运行过程中不需要额外的存储空间。

适当改进下中值的选取方法,让中值更具有代表性:比如“三点取样”,从数据表的头、尾、中间选出中值。

课程练习

1单选(2分)‌以下关于冒泡和选择排序算法的叙述何者正确?

A.平均时间复杂度上,冒泡排序的复杂度较低
B.其它选项皆不正确。
C.空间复杂度上,选择排序的复杂度较低
D.平均时间复杂度上,选择排序的复杂度较低

解析:两者均有O(N^2)的时间复杂度和O(1)的空间复杂度。

2单选(2分)以下关于归并和快速排序算法的叙述何者正确?

A.空间复杂度上,快速排序的复杂度较低
B.平均时间复杂度上,归并排序的复杂度较低
C.其它选项皆不正确。
D.空间复杂度上,归并排序的复杂度较低

解析:空间复杂度上,归并排序的复杂度是O(N),快速排序是O(logN);时间复杂度上均是O(N logN)

3单选(2分)​设一组初始记录关键字序列(5,2,6,3,8),利用冒泡排序进行升序排序,则第一趟冒泡排序的结果为以下何者?

A.2,3,5,6,8 
B.2,3,6,5,8
C.2,5,6,3,8
D.2,5,3,6,8

解析:第一趟冒泡后,2和5易位,3和6易位。

4单选(2分)设一组初始记录关键字序列(5,2,6,3,8),利用插入排序进行升序排序,则第二次插入排序的结果为以下何者?

A.2,3,5,6,8
B.2,5,3,6,8
C.5,2,3,6,8
D.2,5,6,3,8

解析:第一次将2插入到5前面,序列变成2,5,6,3,8;第二次将6插入到5后面,序列还是2,5,6,3,8。

5单选(2分)‏给定两个已分别排序好的列表mylst1, mylst2,两者的长度分别为m<n为已知,现要查找两表合并后的中位数,问最好的查找方式的时间复杂度?(可以理解为,查找 alist=sorted(mylst1+mylst2) 的中位数的时间复杂度)

A.O(mn)
B.O(m^2)
C.O(m logn)
D.O(logm)

解析:先取两者各自的中位数进行比较,并对mylst1进行二分查找,以mylst2对应的反向shift下标取得的值作为比较基准。

6多选(3分)所谓排序算法的稳定性是指:排序前,2个相等的数,其在序列的前后位置顺序,和排序后它们两个的前后位置顺序相同。以下哪些排序算法是稳定的。

A.插入排序
B.归并排序
C.冒泡排序

D.希尔排序

7多选(3分)‎现在有一个几乎顺序排列的,非常大的列表。问以下哪些算法有可能得到时间复杂度O(N)?

A.选择排序
B.快速排序
C.插入排序
D.冒泡排序

解析:
1、排序过程中可检测,如果前段序列的最大值小于等于后段序列最小值,则说明序列可以直接形成一段有序序列不需要再归并。
2、快速排序的比较次数有O(n logn)
3、对于列表 mylst = [100000]+[i for i in range(100000)]+[i for i in range(100001, 200000)],若总是从已排序完成的列表末尾开始检查,那么前100000个插入各要两次比较,后面各要一次比较,比较次数与赋值操作次数均为O(n)。
4、对于列表 mylst = [100000]+[i for i in range(100000)]+[i for i in range(100001, 200000)],第二趟冒泡列表无变动,可判定冒泡排序完成。

8多选(3分)‏以下哪些排序方式,其最坏情况的时间复杂度O(N^2)的?

A.归并排序
B.冒泡排序
C.插入排序
D.选择排序
E.快速排序

数据结构与算法Python版MOOC笔记及练习【七】相关推荐

  1. 数据结构与算法python版 MOOC 第九周

    九.树及算法-上 本系列博客基于" (北京大学)数据结构与算法python版"慕课,课程在中国大学慕课和bilibili上均可找到. 1. 内容 树结构的相关术语 树的表示方法:嵌 ...

  2. 数据结构与算法python版 MOOC 第三周

    三.基本线性结构 本系列博客基于" (北京大学)数据结构与算法python版"慕课,课程在中国大学慕课和bilibili上均可找到. 1. 内容 定义线性结构 讲解栈的结构结构 栈 ...

  3. 1算法分析——数据结构与算法Python版学习笔记

    什么是算法分析? 计算资源指标:一种是算法解决问题过程中需要的储存空间或内存,另一种是算法的执行时间 运行时间检测 time模块,获取计算机系统当前时间 例如: 方法一:累计求和程序的运行时间检测 i ...

  4. mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...

    中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...

  5. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  6. mooc数据结构与算法python版期末测验_中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案...

    中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案 更多相关问题 java.lang 包的 Character 类的 isJavaIdentifierStart 方法的功能是用来判断某 ...

  7. mooc数据结构与算法python版第十一周作业_中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南...

    中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南 更多相关问题 [判断题]实际集成运放的上限截止频率为无穷大 [多选题]现代城市的发展凸现出与以往不同的动力机制包括 教师在引 ...

  8. PDF课件下载!北京大学公开课《数据结构与算法Python版》

    北京大学公开课<数据结构与算法Python版>,面向具有Python语言程序设计基础的大学生和社会公众,介绍常见的基本数据结构以及相关经典算法,强调问题-数据-算法的抽象过程,关注数据结构 ...

  9. python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

最新文章

  1. socket编程中的异常处理
  2. c语言解决一元二次方程,一元二次方程求解程序完整代码
  3. java卡安全域_java – 在安全管理器下解析许多域后,程序内存不足?
  4. CF653F. Paper task
  5. ubuntu lvm mysql vg_使用LVM快照做mysql完全备份和lvm的扩容
  6. python获取url的json数据_通过url获取json数据并在python中使用(simplejson)
  7. Android studio 中使用xUtils报错
  8. MCS-51子程序库-1
  9. tensorboard 使用
  10. 夜间灯光数据dn值_一种基于遥感夜间灯光数据和能源消耗统计数据的城市能耗量空间化方法与流程...
  11. 计算机网络实验——华为ensp安装和初步使用教程
  12. C4D R18-R21
  13. centos安装Docker与使用构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍...
  14. arduino智能浇花系统_基于Arduino单片机的智能浇花器
  15. 防用户误删除,耗费一周时间把DeleteMark标志都加上来了,所有的删除操作从“物理删除”转为“逻辑删除”
  16. 幼儿园案例经验迁移_在建构区中如何将游戏经验迁移为知识经验
  17. Android类似IOS的果冻效果
  18. 调试Cello时快速清除已有容器
  19. 怎么才能做好一个软件销售
  20. 互联网+废品回收项目数据库设计说明书

热门文章

  1. Android仿微信发起群聊的列表样式
  2. c语言中变量后面加上f,C语言的数据类型
  3. Oracle存储过程以及游标嵌套实际使用
  4. 不爱说话?社交无能?或许你可以试试这种说话术
  5. 【文献阅读】Probabilistic Terrain Mapping for Mobile Robots With Uncertain Localization
  6. 如何去使用Python分析股票数据?学到就是赚到
  7. cbrt c语音_sqrt - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  8. 读《计算机网络》——深入浅出——以考研为目标学技术面试知识二刷计网——网络层
  9. 浏览器网页标签页图标显示
  10. 融资 30 亿元后,李想坦承了他最大的恐惧