又到了大二的孩子们学数据结构的时候了,把原来写的发出来一下,供大家参考。
有疑问的可以留个言啥的!我应该会和大家讨论讨论,虽然是大三的老学长。。有的内容应该是还能想起来的

一、插入类排序:
1、直接插入排序:稳定
2、折半插入排序:稳定
PTA上的试题:
对一组包含10个元素的非递减有序序列,采用直接插入排序排成非递增序列,其可能的比较次数和移动次数分别是: (2分)4
- 100, 100
- 100, 54
- 54, 63
- 45, 44
解析:对于直接插入排序最糟糕的情况是顺序完全倒序,此时需要的比较次数是(n-1)+(n-1)(n-2)/2.
需要是移动次数是上式减一。(?)
设有1000个元素的有序序列,如果用二分插入排序再插入一个元素,则最大比较次数是:(2分)4
最糟糕的情况是序列的头或者尾
- 1000
- 999
- 500
- 10
- 对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。 (2分)F
T F
归并趟数的数量级就是归并树的高度减去1,应该是把这n个数一部分一部分的半劈,也就是log以二为底n次
采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是: (2分)c
- 每次划分后,先处理较长的分区可以减少递归次数
- 每次划分后,先处理较短的分区可以减少递归次数
- 递归次数与每次划分后得到的分区处理顺序无关
- 递归次数与初始数据的排列次序无关
虽然分区处理顺序有先有后,但是终究是要处理的。所以预处理顺序无关。但是会和分区的划分有关,而划分取决于初始的顺序
在快速排序的一趟划分过程中,当遇到与基准数相等的元素时,如果左右指针都不停止移动,那么当所有元素都相等时,算法的时间复杂度是多少?(2分)4
- O(logN)
- O(N)
- O(NlogN)
- O(N2)
在这里的不停止移动指的是不把这个指针位置的元素放到空的位置上,而是继续左移,所以每个元素都是移动n-i次,放了头上,那么在划分的时候左边的那一块是空的,所以运行次数是等差数列,所以是n的平方
在快速排序的一趟划分过程中,当遇到与基准数相等的元素时,如果左指针停止移动,而右指针在同样情况下却不停止移动,那么当所有元素都相等时,算法的时间复杂度是多少?(2分)4
- O(logN)
- O(N)
- O(NlogN)
- O(N2)
与上一个题同理,右指针是先移动的那个,所以就是一气移动到头部了,和上一个题的情况一样
对N个记录进行归并排序,空间复杂度为: (1分)2
- O(logN)
- O(N)
- O(NlogN)
- O(N2)
因为总是需要一个和l等长的数组来存放归并好的序列
对N个记录进行简单选择排序,比较次数和移动次数分别为O(N2)和O(N)。 (1分)T
T F
简单选择排序是在每一趟选出来要移动的最大值或者最小值,一共进行n趟,平均每一趟N/2个数字,所以算过来是n的平方;而移动就是每个数字都移动一下,也就是n个
KMP算法的特点是在模式匹配时指示主串的指针不会变小回溯。 (2分)T
T F
对于10个数的简单选择排序,最坏情况下需要交换元素的次数为: (2分)1
- 9
- 36
- 45
- 100
因为倒最后一趟的时候要找的序列只有第一个元素自己 ,所以就不用比较了,比较n-1次就可以
有组记录的排序码为{ 46,79,56,38,40,84 },则利用堆排序的方法建立的初始堆为: (2分)4
- 79,46,56,38,40,80
- 84,79,56,46,40,38
- 84,56,79,40,46,38
- 84,79,56,38,40,46
初始化大顶堆是从倒数第一个不为叶子的节点开始筛选,注意!!每次筛选时,把头部的数值先存下来,然后和每个大孩子的数值比较,如果比大孩子还小,就让当前的头部等于大孩纸的值,最后再让确定下来的位置处等于一开始的head节点的值
对N个记录进行堆排序,最坏的情况下时间复杂度是: (1分)3
堆排序不管什么情况下的时间复杂度都是 NlogN
- O(logN)
- O(N)
- O(NlogN)
- O(N2)
11
(neuDS)设主串的长度为n,模式串的长度为m,则串匹配的KMP算法时间复杂度是( )。 (2分)3
- O(m)
- O(n)
- O(n + m)
- O(n×m)
串 ‘ababaaababaa’ 的next数组为: (2分)3
next的获取方法:(1)找到不对应的那一位的下标
(2)找他的真子串
(3)找这些真子串中最长的一个可以完全从头到尾被匹配的一个
(4)next值为真子串长度加一
比较特殊的是第一个为0
- 012345678999
- 012121111212
- 011234223456
- 0123012322345
字符串‘ababaabab’ 的nextval 为: (3分)1
链接:https://www.nowcoder.com/questionTerminal/6bfed2073b48431ea5bfea01684e9ef1
来源:牛客网
我们令 nextval[0] = -1。nextval[1]是他自己的next[1].从 nextval[2] 开始,如果某位(字符)与它 next 值指向的位(字符)相同,则该位的 nextval 值就是指向位的 nextval 值(nextval[i] = nextval[ next[i] ]);如果不同,则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。
- (0,1,0,1,04,1,0,1)
- (0,1,0,1,0,2,1,0,1)
- (0,1,0,1,0,0,0,1,1)
- (0,1,0,1,0,1,0,1,1 )
本文介绍了数据结构中的排序算法,包括直接插入排序、折半插入排序等插入类排序,详细解析了各种排序算法的比较次数和移动次数,并探讨了在特定情况下的时间复杂度,如快速排序和归并排序。此外,还提到了KMP算法和堆排序等相关知识点。
&spm=1001.2101.3001.5002&articleId=85040232&d=1&t=3&u=49fb71b7c72c45e6909d4a362c19b296)
5136

被折叠的 条评论
为什么被折叠?



