X32专项练习部分18
快速排序导致算法效率最低的情况
/*
假设基准值为数组首元素的快速排序,要使得数组满足非降序排列
下列数据分布导致快排算法效率最低的是
正确答案: D
6-2-3-5-4-1-7
7-5-3-2-4-1-6
1-5-7-2-4-6-3
1-2-3-4-5-6-7
快速排序时间复杂度为nlogn,其中是代表每次排序需要O(n)
logn代表的递归深度,也就是需要排序的次数
当给出的数据有序,那么二叉树会退化为一条斜链
就形成类似单链表的形式
这样访问的速度会变慢
那么此时递归深度就变为n了
此时的时间复杂度就为n^2
快速排序就会退化成冒泡排序
再补充1下常识
在数组基本有序的情况下
快速排序越慢,堆排序越快
*/
多路归并排序算法以及归并段
/*
设某文件经内排序后得到100个初始归并段(初始顺串)
若使用多路归并排序算法,且要求三趟归并完成排序,问归并路数最少为
正确答案: D
8
7
6
5
5*5*5=125,4*4*4=64,
64<100<125
所以为5
可以把这个解题过程看作是求解完全多叉树的层数
有100个归并段,可以把这100归并段看作叶子节点
那对于完全多叉树而言,最低层(根节点是最高层)的节点数目 <= n^k-1
其中n是叉数,k是层数
归并趟数为3,则k-1=3
则可以知道n^3>=100,则n>=5
这样并不完善,因为叶子节点并不一定全在最低层,次最低层也可以包含叶子节点
但如果叶子节点全在第3层,则叶子节点最多25个
因此当有100个叶子节点时,完全5叉树一定是4层结构,能够满足题目归并3次的要求
*/
中缀表达式求值
/*
对中缀表达式 3*2^(4+2*2-6*3)-5 进行求值
求值过程中当扫描到6时,对象栈和算符栈分别为()
其中^为乘幂。
正确答案: D
3,2,8; *^-
3,2,4,2,2; *^+*-
3,2,4,2,2; *^(+*-
3,2,8; *^(-
和运算符的优先级有关,
其中s1表示数栈(对象栈)
s2表示符号栈(算符栈)
1、操作数栈置空,将表达式起始符"#"作为运算符栈的栈底元素
2、依次读入每个字符,若是操作数则入操作数栈
若是运算符s1则和运算符栈顶元素s2比较优先级后进行相应的操作
直至整个表达式求完
1) 若优先级s1>s2,s1入栈
2) 若s1<s2,当前栈顶运算符s2退栈
操作数栈顶的两个操作数退栈与操作符一起运算
并将运算结果入操作数栈
(1)操作数3,入栈s1;
(2)运算符*,入栈s2;
(3)操作数2,入栈s1;
(4)运算符^ ,入栈s2;(^的优先级比 *高,操作符优先级比当前优先级高,直接入栈)
(5)运算符(,入栈s2;
(6)操作数4,入栈s1;
(7)运算符+,入栈s2;
(8)操作数2,入栈s1;
(9)运算符*,入栈s2;(理由是:*的优先级比+高)
(10)操作数2,入栈s1;
(11)运算符-,
(-的优先级低于*)栈顶字符 * 出栈,完成2*2=4的运算,将结果4存入s1中
---s1:3,2,4,4;
(-的优先级低于或等于+)栈顶字符+出栈,完成4+4=8的运算,将结果8存入s1中
---s1:3,2,8;
此时,-成为了(后的运算符,则直接入栈s2
---s2:*^(-;
(12)操作数6 扫描;
*/
二维数组列存储偏移量
/*
二维数组k[1..7,1..9],每元素大小占2个字节
而且使用列存储,a[5,4]的偏移量为()个字节。
正确答案: D
78
39
25
50
据题意可知
当前数组索引从0开始
首先可以确定的是9行7列
问题中的a[5][4]指的是在第五列的第四个
这个地方大家可能误解了
还有就是二维数组转化成一维数组的公式a[x][y]=b[x*列数+y]
其中的x,y的起始地址为0,不是1
此时再次注意题目问的是列存储,也就是x表示当前列
这里容易出错
所以这题应该减一,也就是a[4][3],3*7+4=25
再乘以2(每个元素占2字节)结果出来了
*/
推断后序遍历的结果
/*
对某二叉树进行前序遍历的结果为ABDEFC
中序遍历的结果为DBFEAC,则后序遍历的结果为()
正确答案: B
DBFEAC
DFEBCA
BDFECA
BDEFAC
前序遍历 中左右
中序遍历 左中右
后续遍历 左右中
我做的时候使用的排除法
先根据后序遍历根节点最后排除AD选项
再根据每次先遍历每棵树的左子树
排除C选项
这里需要注意1点,由于F是E的左子节点
所以在中序遍历的时候
F在E的前面
因为E-F也算1棵树
在遍历到E的时候
扫描到E存在左子节点
需要先遍历左子节点
这棵树的左子树中
D为B的左子节点
E为B的右子节点
F为E的左子节点
有点类似于递归
*/
判定树高度和比较次数
/*
在有序表(5,8,36,48,50,58,88)中二分查找字58时所需进行的关键字比较次数是()
对应的判定树高度为()
正确答案: B 你的答案: B (正确)
2,2
2,3
3,2
3,3
首先
根据有序表构建二叉树
类似于中序遍历每次指针
指向需要被创建的节点
节点的内容就是动态变化的索引
48
/ \
8 58
/ \ / \
5 36 50 88
58在第二层,也就是第二次比较就可以确定了
BST的高度为3,也就是最多要经过3次排序
所以最终结果为 2,3
简单总结一下
判定树高度:生成的树的高度
比较次数:节点在第几层比较几次
*/
插入排序比较次数即有序范围
/*
在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时
当把第7个记录60插入到有序表时,为寻找插入位置需比较()次
正确答案: D 你的答案: D (正确)
5
6
4
3
在插入第7个数,说明前面的数字已经有序了。
即数字为15--- 23---38---54----72---96---60---45---83
现在对滴7个数字60进行插入,需要向前找到插入点。依次比较,96,72,54.最后插入在54后面。
所以比较3次
插入排序的有序范围是不断递增的
针对原始序列
第1趟插入排序可以保证索引为0,1的数有序
第2趟插入排序可以保证索引为0,1,2的数有序
...
第n趟插入排序可以保证索引为0,1,2...n的数有序
*/
二叉排序树中的最小值
/*
二叉排序树中的最小值在二叉排序树的何处
正确答案:C
只能在根节点
只能在叶子节点
可能在叶子节点,也可能在根节点,也可能在只有右孩子的父节点
可以在任何节点
A:若根节点有左孩子,则必然根节点不是最小值;所以A错误
B:若根节点有右孩子,则必然根节点小于右孩子这个叶子结点,所以B错误
C:当根节点只有右孩子时,可能为根节点
即为只有右孩子的父节点
当根孩子只有左孩子,可能为叶子结点
D:只需举出反类即可:不可能为具有右孩子的这个树的右孩子节点
不要举常规例子
要考虑极端情况
*/