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

什么是顺序查找

数据项保存在像列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。
在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.快速排序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值