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:只需举出反类即可:不可能为具有右孩子的这个树的右孩子节点

不要举常规例子
要考虑极端情况
 */

总目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值