收藏 分享(赏)

计算机软件基础(二)习题答案.doc

上传人:dreamzhangning 文档编号:4030052 上传时间:2018-12-05 格式:DOC 页数:53 大小:405KB
下载 相关 举报
计算机软件基础(二)习题答案.doc_第1页
第1页 / 共53页
计算机软件基础(二)习题答案.doc_第2页
第2页 / 共53页
计算机软件基础(二)习题答案.doc_第3页
第3页 / 共53页
计算机软件基础(二)习题答案.doc_第4页
第4页 / 共53页
计算机软件基础(二)习题答案.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、1计算机软件基础(二) 习题解答第 1 章 概论复习题答案1 怎样的计算机被称为裸机?什么是虚拟计算机?【解答】:对于一台只有硬件构成(通常包括:中央处理器 cpu,储存器,输入和输出设备) ,而没有安装任何软件的计算机被称为裸机。而虚拟计算机则是指以硬件为物质基础,加装软件后的扩充后的计算机系统。2 计算机软件资源的作用如何?在你使用的计算机上有那些软件资源?【解答】:计算机软件资源的作用是只有在软件资源的支持下,用户所使用的计算机才能极大程度上满足用户需要的虚拟计算机。软件资源有:汇编程序;各种高级语言;各种语言的解释或编译程序;各种标准程序库;操作系统;数据库系统软件;计算机网络软件;各

2、种应用软件等。3 汇编语言和高级语言有什么不同?【解答】:汇编语言是面向机器的语言,即不同型号的计算机的汇编语言是各不相同的,进行程序设计时必须了解所使用的计算机的结构性能和指令系统,而且编好的程序也只是针对一类机器,不能通用。高级语言是面对过程的语言,用户不必了解具体机器的细节就能编写程序,方便了程序的设计,提高了效率,同时也便于人们的交流。4 我们知道计算机只能执行机器指令,为什么它能运行汇编语言和高级语言编写的程序?【解答】:计算机之所以能运行汇编语言编写的程序是因为计算机系统中装有汇编程序,汇编程序的作用是将源程序翻译成用机器语言组成的目标程序,从而计算机能运行汇编语言编写的程序。计算

3、机之所以能运行高级语言编写的程序是因为计算机系统中装有解释程序或编译程序,它们将用高级语言编写的程序翻译成用机器语言组成的目标程序,从而计算机能运行高级语言编写的程序。5 你学习过那些高级语言?试分析它们的特点和适用的范围?【解答】:fortran 语言主要用于科学和工程计算;pascal语言则具有良好的程序结构,cobol 语言则是面向事务处理的;lisp 语言是人工智能语言;c 语言则是通用的程序设计语言;c语言是面向对象的程序设计语言。6计算机软件的定义是什么?【解答】:计算机软件是指:计算机程序,实现程序功能所采用的方法,规则以及相关联的文档和在机器上运行它所需要的数据。7 操作系统的

4、作用是什么?【解答】:操作系统控制和管理计算机的硬件、软件资源,实现对处理机,存储器,2I/O 设备,文件等四类资源的管理,同时操作系统 还作为用户和计算机系统之间的接口,方便了人机交互。8 计算机操作系统在发展中经历了那些阶段?试简述它们的特点?【解答】:主要经历了:手工操作阶段、成批处理系统阶段、执行程序阶段、多道程序系统和分时系统阶段。手工操作阶段的特点:计算机的全部资源归一个用户的一个程序独占操作过程有人工来干预。成批处理系统阶段:相对于手工操作阶段,它提高了计算机资源的利用率和增强了系统的处理能力,但由于处理机和 I/O 设备是串行工作的,大部分时间被消耗在输入输出上,处理机的大部分

5、时间处于等待状态,故处理机和 I/O 设备的速度不匹配的矛盾 成为进一步提高计算机的效率的关键。执行程序阶段:使系统实现了模块化结构,易于设计、修改和扩充,但由于计算机本身的顺序性,计算机并不能完全消除对外设传输的等待。多道程序系统:它需要一个调度算法来解决cpu 的分配问题,需要有一个储存管理程序来解决多道程序在内存中的定位,分配和免遭破坏,需要有一个设备管理程序来解决外设的分配,释放和信息交换,此外还需要有一个文件管理程序来解决以文件形式存放于外存中的程序和数据。分时系统阶段:分时系统阶段采用划分时间片的方法来接受和处理各个用户从终端输入的命令,由于计算机运行的高速性和并行性,使每个用户感

6、觉不到别的用户的存在,好像独占整台机器。9 计算机应用软件有那些?【解答】:主要有以下三大领域:事务处理软件,工程和科学计算软件,实时应用软件。随着计算机技术的发展一些新的领域异军突起,如:嵌入式应用软件,微型机工具软件,人工智能软件。3第 2 章 数据结构复习题答案一、选择题1线性表 L 在 情况下适用于 使用链式结构实现。(A):需经常修改 L中的结点值 ;(B):需不断对 L 进行删除和插入;(C): L 中含有大量的结点; (D): L 中结点结构复杂;【答案】:应选 B2线性表在采用链表存储时其地址 。(A): 必须是连续的; (B):部分地址是连续的;(C):一定不是连续的; (D

7、):连续不连续都可以;【答案】:应选 D3数组 Qn 用来表示一个循环队列,f 为当前队列头元素的前一个位置,r 为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为 。(A):r-f ;(B): (n+f-r)%n ;(C): n+r-f ;(D):(n+r-f)%n ;【答案】:应选 D4若入栈序列为1,2,3,4,在入栈的过程中允许出栈,则 不可能是一个 出栈序列。(A):1,4,3,2; (B): 2,3,4,1;(C):3,1,4,2 ;(D):3,4,2,1;【答案】:应选 C5一个二维数组M,行下标的范围是 1 到 8,列下标的范围是 0 到 9,每个数组元素用相

8、邻的 5 个字节存储,存储器按字节编址,设存储数组元素 M(1,0)的第一个字节的地址是98,且按列存储,则 M(3,7)的第一个字节的地址是 。(A):135; (B):233; (C): 290; (D):388;【答案】:应选 D。6由 3 个结点所构成的二叉树有 种形态,由 3 个结点构 成的树有 种形态。(A):3; (B):4 ;(C): 5; (D): 6 ;【答案】:应选 C 和 A;7不含任何结点的空树 。(A): 是一棵树; (B):是一棵二叉树; (C): 是一棵树也是一棵二叉树;(D):既不是一棵树也不是一棵二叉树;【答案】:应选 B。8一棵深度为 k的满二叉树中结点的

9、个数是 。(A): 2 k-1;(B):2 k;(C):2 k-1;(D):2 k+1;【答案】:应选 A49一棵具有 257 个结点的完全二叉树,它的深度为 。(A): 8 ;(B):9 ;(C): 7; (D):10;【答案】:应选 B10二叉树是非线性数据结构,所以 。(A):它不能用顺序存储结构存储;(B):它不能用链式存储结构存储;(C):用顺序存储结构和链式存储结构都能存储;(D):顺序存储结构和链式存储结构都不能存储;【答案】:应选 C11把一棵树转换为二叉树后,这棵二叉树的形态是 。(A): 唯一的; (B):有多种;(C):有多种,但根结点都没有左孩子;(D):有多种,但根结

10、点都没有右孩子;【答案】:应选 A12在表长为 n 的链表中进行线性查找,它的平均查找长度为 。(A):ASL= n ; (B):ASL= (n+1)/2 ;(C):ASL= +1 ;(D):ASL log 2 (n+1)-1;【答案】:应选 B二、填空题1数据的基本单位是 ,它可以由 组成。【答案】:数据元素; 数据项。2把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构是 。【答案】:顺序存储结构。3顺序表结构适宜于进行 存取;链表适宜于进 行 存取。【答案】:随机存取;顺序存取。4栈是一种特殊的线性表,允许插入和删除运算的一端为 ,不允许插入和 删除运算的一端为 。【答案】:栈

11、顶;栈底。5 是被限定为只 能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。【答案】:队列。6 三元组表中的每个结点对应与稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 , 和 。【答案】:行下标;列下标;元素值。57 对于一棵非空二叉树,它的根结点作为第一层,则它的第 i 层最多能有 个结点。【答案】:2 i-1。8 把一棵树转化为二叉树以后,这棵二叉树的根结点没有 。【答案】:右子树。9 在数据的存放无规律而言的线性表中进行检索的最佳方法是 。【答案】:线性检索。10有一个表长为m 的散列表,初始状态为空,现将 n (nlink; return (i);3 给定一

12、个 n 项元素的线性表V,写一个算法,将元素排列的次序颠倒过来,要求仍占用原来的空间,并且用顺序表和单链表两种方法表示。【分析】:将 V1与 Vn交换,V2与 Vn-1交换,Vn/2与 Vn/2+1交换.【答案】:顺序表结构下的实现:#define M 1000int vM;int n;void invert( )int temp;for(i=0;ilink;u-link=p;/*将删除的结点插入到另一个链表中 */p=u; head=p;/* 新链表的头指针 */4试设计实现在单链表中删除值相同的多余结点的算法。【答案】:typedef struct snodechar data; stru

13、ct snode *link; NODE;void purge_lklist(NODE *head)NODE *p,*q,*r;p=head-link;/* p 指向当前检查结点的位置,先将其初始化 */if(p=NULL) return;/* 空表返回 */while(p-linkt!=NULL) /* 当前结点不是尾结点 */q=p;while(q-link!=NULL) /* 删除值与 p 所指结点的值相同的结点 */if(q-link-data=p-data) /* 若有值相同的结点*q */r=q-link;q-link = q-link-link; /* 删除多余结点 */free

14、(r ); else q=q-link;/* 找下一个可以的多余结点 */p=p-link; /* 更新检查结点 */5描述以下三个概念的区别:头指针、头结点、首元元素结点。【答案】:头指针:是指向单链表的第一个结点的指针。头结点:在链表的首元元素结点之前附设的一个结点。首元元素结点:是指用于存储线性表中第一个数据的结点。6写出计算线性链表长度的算法。【分析】:根据单链表的特性,从单链表第一个结点开始访问,只要是非空结点,计8数一次,直到所有结点访问一遍。【答案】:typedef struct snodechar data; struct snode *link; NODE;int lengt

15、h(NODE *head)NODE *p; int i;p=head; i=0; /*初始化 */while (p!=NULL)i+; p = p-link; return (i);7设有一个线性链表,其结点为正整数,且按值从小到大链接。试写出一个算法,将此线性链表分解成两个线性链表,其中一个链表中的结点值均为奇数,而另一个链表中的结点值均为偶数,且这两个链表均按值从小到大链接。【分析】:在链表 head 中依次取元素(s-data),若取出的元素是奇数,把它插入到奇数链表 ahead 中,若取出的元素是偶数,把它插入到偶数链表 bhead 中,继续取下一个元素,直到链表的尾部,头指针 ahe

16、ad 和 bhead 分别指向奇数链表和偶数链表。【答案】:typedef struct snodeint data; struct snode *link; NODE;void examp7(NODE *head,*ahead,*bhead)NODE *p,*q,*s;ahead=(NODE *)malloc(sizeof(NODE);/* 建立奇数链表的头结点 */p=ahead;, /* 工作指针 p 初始化。*/bhead=(NODE *)malloc(sizeof(NODE);/* 建立偶数链表的头结点 */q=bhead; /*工作指针 q 初始化。*/s= head-link;

17、free(head);/* s 为原表中的工作指针,释放原表中的头结点 */while (s!= NULL)if( s-data % 2=0) /*是偶数 */ q-link = s ; q = q-link ;else / * 是奇数 * / p-link = s ; p = p-link; s = s-link ; /* 取下一个结点 */p-link = NULL; /* 置奇数表的表尾 */q-link = NULL; /* 置偶数表的表尾 */8假设有一个循环单链表的长度大于 1,且表中既无头结点也无头指针。已知 S 为指向链表中某结点的指针,试编写算法,在链表中删除S 指针所指结点

18、的前驱结点。【分析】:设置一个指针p,指向 S 结点的前驱结点的前驱结点。【答案】:typedef struct snodechar data; struct snode *link; NODE;NODE *s;void deleteprior( )9NODE *p, *q;p = s;while(p-link-link!=s)p=p-link;/*让 p 指向 s 结点的前驱结点的前驱结点 */q=p-link; /* q 指向被删除结点 */p-link = q-link; /* 删除 */free(q);9已知指针 ha和 hb 分别指向两个单链表的头结点,且头结点的数据域中存放链表的长

19、度,试写出一个算法将这两个链表连接在一起,并要求算法以尽可能短的时间内完成运算。【分析】:令表 hb 的首元结点连在表ha 中的最后一个结点之后,首先想将工作指针p 从 ha的首元结点开始遍历到表 ha 中的最后一个结点,hc 指向连接后的链表的头结点。【答案】:typedef struct snodechar data; struct snode *link; NODE;NODE *ha,*hb,*hc;void example9( )NODE *p; int i;hc = ha ; /* hc 指向连接后的链表的头结点 */p = ha-link; i=1; /* 用于表 ha 中结点的计

20、数器 */while(idata) p = p-link;/* ha-data 是表ha 的长度 */p-link = hb-link; /* 连接表 hb 的首元结点 */hc-data = ha-data + hb-data; /* 连接后的链表的长度 */ 10对于下面的每一步,画出栈元素和栈顶指针示意图。(1)栈空;(2)在栈中入栈一个元素 A;(3)在栈中入栈一个元素 B;(4)出栈中一个元素;(5)在栈中入栈一个元素 C;(6)出栈中一个元素;(7)出栈中一个元素;【答案】:(1) (2) (3) (4) (5) (6) (7)11设有编号为 1,2,3,4 的四辆列车,顺序进入一

21、个栈式结构的车站,具体写出这四辆列车开出车站的所有可能的顺序。【答案】:1,2,3,4; 1,2,4,3; 1,3,1,4; 1,3,4,2;1,4,3,2;2,1,3,4; 2,1,3,3; 2,3,1,4; 2,3,4,1;AB A A A A C 102,4,3,1;3,2,1,4; 3,2,4,1; 3,4,2,1; 4,3,2,1;12说明栈和队列的异同点。【答案】:相同点:栈和队列都是线性表结构;不同点:栈是限定在线性表的一端进行插入和删除的操作;而队列的插入和删除在线性表的两端进行;13顺序队的“假溢出”是怎样产生的?如何知道循环队是空还是满?【答案】:队列的尾指针已经到了数组的

22、上界,此时如果还要执行入队运算,就要发生“上溢” ,但是数组中还有空位置,这种现象称为“假溢出” 。在循环队中, 当 rear=front 时,表示队空;当 (rear+1)%M= =front 时,表示队满。14设循环队列的容量为 40(序号从 0 到 39) ,现经过一系列的入队和出队运算后,有(1)front = 11, rear=19;(2)front = 19, rear = 11;问在这两种情况下,循环队列中的各有多少个元素?【答案】:(1):8 个 ; (2):32 ;15假设一数组 squm存放循环队列的元素。若要使 m 个分量都得到利用,则需要另一个标志 tag,以 tag

23、为 0或 1 来区分队尾指针和队头指针值相同时队列的状态是“空”还是“满” 。试编写与此结构相应的入队和出队的算法。【答案】:#define M 100int squM,front,rear,tag;/* 队列中加一个标志域 tag */int addque(int x) /* 入队运算 */if (tag=1)&(front=rear) printf(“full queuer!n”); return (-1) ; else rear = (rear+1)%M;squrear = x; if (rear=front) tag=1 ; /* 如果插入后队列满,则置标志 */ int delque

24、( ) /* 出队运算 */if( tag=0) &(front=rear) printf (“empty queuer !n”); return(-1); else front = (front+1% M; if(front=rear) tag=0;/* 如果删除后队列空,则置标志 */return (squfront);1116假设以带头结点的循环单链表表示队列,并且只设一个指针指向队尾元素结点,不设头指针,试编写相应的入队和出队算法。【答案】:typedef struct snodeint data; struct snode *link; NODE;NODE *rear; /* 定义结

25、点的类型和指向队尾的指针*/void addqueue (int x)NODE *p;p = (NODE *)malloc(sizeof(NODE);/* 申请结点空间 */p-data = x;p-link = rear-next; rear-next = p; /* 在队尾插入结点 */rear = p; /* 修改队尾指针 */int delequeue( ) /*从链队中出列,返回出队的数据元素 */NODE *p;if (rear-link=rear) printf(“queue is empty!n”); return(-1); else p=rear-link; /* p 指向头

26、结点 */q=p-link; /* q 指向被删除结点 */if(q=rear) rear=p; /* 队列中仅有一个结点时,先修改尾指针*/p-link=q-link; x=q-data;free(q); return(x); /* 删除结点并返回 */17已知二维数组A m,m 采用按行优 先顺序存放,每个元素占 K个存储单元,并且第一个元素的存储地址为 LOC(a 11) ,请写出 LOC(a ij)的计算公式。如果采用列优先顺序存放呢?【答案】:按行优先顺序存放:LOC(a ij)=LOC(a11)+(i-1)*m + (j-1)*K;按列优先顺序存放:LOC(a ij)=LOC(a1

27、1)+(j-1)*m + (i-1)*K;18用三元组表表示下列稀疏矩阵:0 0 0 0 0 0 0 0 0 0 0 0 0 -20 0 0 0 0 0 0 0 0 0 0 0 9 00 3 0 0 0 8 0 0 0 0 0 0 0 0(1) 0 0 0 0 0 0 0 0 (2) 0 0 5 0 0 00 0 0 6 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 3 00 0 0 0 0 0 0 52 0 0 0 0 0 0 0【答案】: (1) (2)行 下 标 列 下 标 元 素 值6 6 41 6 -22 5 94 3 56 5 31219下列

28、各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。6 4 61 2 2 4 5 51 3 12 1 1 1(1) 3 1 3 (2) 2 4 94 4 4 3 2 85 3 6 3 5 66 1 16 4 3 7【答案】:0 2 12 0 1 0 0 0 00 0 0 0 0 0 0 9 0(1): 3 0 0 0 (2): 0 8 0 0 60 0 0 4 0 0 7 0 00 0 6 016 0 0 020什么样的二叉树不是树?一棵度为 2 的树与一棵二叉树有何区别?【答案】:空树是二叉树,但不是树。树一定是非空的。在一棵度为 2 的树中至少有一个结点的度为 2;但在一棵二叉树中每个结

29、点的度可以都小于 2,比如单枝树。21试分别画出具有 3 个结点的树和有 3 个结点的二叉树的所有不同形态。【分析】:无序树的子树没有顺序之分,而二叉树的子树分为左子树和右子树。【答案】:具有 3 个结点的树 :行 下 标 列 下 标 元 素 值8 8 53 2 33 6 85 4 67 8 58 1 213有 3 个结点的二叉树:22设一棵完全二叉树具有 1000 个结点,问此完全二叉树(1)有多少个叶子结点?(2)有多少个度为2 的结点?(3)有多少个结点只有非空左子树?(4)有多少个结点只有非空右子树?【分析】:有 1000 个结点的完全二叉树共有 10层,在第 10 层有1000-(2

30、 9-1)=1000-511=489 个结点;都是叶子结点,它们共有 244+1 个双亲结点在第 9 层,其中有一个双亲结点只有一个孩子,其他共 244个双亲结点的度均为 2,所以在第 9 层还有 256-245=11 个结点的度为 0,既为叶子结点。【答案】:(1)有 500 个叶子结点。(2)有 255+244=499 个度为2 的结点;(3)有 1 个结点只有非空左子树;(4)没有结点只有非空右子树;23下面是有关二叉树的叙述,哪些是正确的?(1)二叉树中每个结点的两棵子树的高度差不大于 1。(2)二叉树中每个结点的两棵子树的高度差等于 1。(3)二叉树中每个结点的两棵子树是有序的。(4

31、)二叉树中每个结点的两棵非空或有两棵空子树。(5)二叉树中每个结点的关键字值大于左子树(若存在的话)上所有结点的关键字值,且小于其右非空子树(若存在的话)上所有结点的关键字值。(6)二叉树中所有结点个数是 2k-1 1,其中 k 是树的深度。(7)二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。【答案】:(1)错误。AVL 树中每个结点的两棵子树的高度差不大于 1。(2)错误。(3)正确。(4)错误。二叉树中有些结点可以有一棵空子树,一棵非空子树。(5)错误。二叉排序树满足所叙述的条件。(6)错误。二叉树中所有结点个数至多是 2k 1 。(7)错误。二叉树中的结点,可以没有非空左子

32、树,但有非空右子树。24用链式结构存储二叉树,试写出下列算法:(1)按层次输入所有结点;(2)输出所有叶子结点。【答案】:/* 先定义二叉树的二叉链表结构*/14typedef struct node int data; struct node *lchild,*rchild; NODE;(1)按层次输入所有结点:【分析】: 本算法要借用队列来完成,其基本思想是,只要队列不为空,就出队列,然后判断该结点是否有左孩子和右孩子,如有就依次输出左、右孩子的值,然后让左、右孩子进队列。void layorder(NODE *root)/* 设 q 是一个队列,函数 initqueue(q)、addqu

33、eue(q,x)、delqueue(q)、empty(q)在 2.4.2 队列中已实现 */initqueue(q); /* 初始化一个队列 */if (root!=NULL) printf(“%d”,root-data); /* 输出结点值 */addqueue(q,root); /* 根结点入队 */while( NOT empty(q) /* 如果队列不空 */p=delqueue(q); /* 对头元素出队 */if (p-lchild!=NULL) printf(“%d”,p-lchild-data); /* 输出左孩子的值 */addqueue(q,p-lchild); /* 左孩

34、子入队 */if (p-rchild!=NULL) printf(“%d”,p-rchild-data); /* 输出右孩子的值 */addqueue(q,p-rchild); /* 右孩子入队 */(2)输出所有叶子结点:【分析】: : 本算法为先根遍历的递归算法。如果树不空,分三步进行:第一步,判断根结点是否为叶子结点,若是,则输出;第二步,调用该算法输出根结点的左子树上的所有叶子结点;第三步,调用该算法输出根结点的右子树上的所有叶子结点;【答案】:typedef struct node int data; struct node *lchild,*rchild; NODE;void pr

35、intleaf(NODE *root)if (root!=NULL)if(root-lchild=NULL)&(root-rchild=NULL) printf(“%d”,root-data); /* 如根结点是叶子结点,则输出 */printleaf(root-lchild); /* 输出左子树上的所有叶子结点 */printleaf(root-rchild); /* 输出右子树上的所有叶子结点 */25已知一棵具有n 个结点的完全二叉树被顺序存储于一维数组 btree 中,试编写一个算法打印出编号为 i 的结点的双亲和所以孩子。15【答案】: #define N 100 int btree

36、N /* 定义完全二叉树的存储结构 */void print_parent_child(int n,int i) /*n 为结点个数 */if(n=0) printf(“ Tree is empty!”); return; /* 空树 */else if(in) printf(“ order i error!”); return; /* 编号出错 */else if(i=1) /* 根结点无双亲 */ printf(“ No parentsn”);if(2*ilchild=NULL)&(root-rchild=NULL) return (1); /* 如根结点是叶子结点,则深度为 1 */el

37、se hl=depth(root-lchild); /* 左子树的深度 */hr=depth(root-rchild); /* 右子树的深度 */if(hlhr) return(hl+1);else return(hr+1); /*深度为 max(hl,hr)+1 */30对序列 12,7,17,11,16,2,13,9,21,4 构成一棵二叉排序树。【答案】:AB FC GD E H127 1711 219 1342 161731从供选择的答案中找出应添入下列叙述中的( )内的正确答案。(1)要进行线性查找,则线性表( ) ;(2)要进行二分查找,则线性表( ) ;(3)要进行散列查找,则线

38、性表( ) ;(A):必须以顺序方式存储;(B):必须以链式方式存储;(C):必须以散列方式存储;(D):既可以以顺序方式存储,也可以以链式方式存储;(E):必须以顺序方式存储且数据元素已按值递增或递减的次序排好。(F):必须以链式方式存储且数据元素已按值递增或递减的次序排好。【答案】:(1)选择 D;(2)选择 E;(3)选择 A;32用二分查找的查找速度必然比线性查找的速度快。这说法对吗?为什么?【答案】:正确。因为用二分查找法来查找时,在每一次比较之后,如查找不成功,是将待查范围缩小一半。而采用线性查找时,每次比较之后是将待查范围缩小一个元素。二分查找的平均查找长度为:log 2n;而线

39、性查找的平均查找长度为:(n+1)/2。33说明散列查找和其它查找方法的区别。【答案】:散列查找是希望平均查找长度与记录的个数无关,既不经过任何比较, “一次”存取就能得到所要查找的元素的查找方法。它要求在元素的存储位置和它的关键字之间建立一个确定的对应关系,使每个关键字和结构中一个唯一的存储位置相对应。而其它的查找方法的平均查找长度都与记录的个数有关,但不必在元素的存储位置和它的关键字之间建立一个确定的对应关系。34r 是一个顺序表结构的有序表,编写一个查找算法,要求在查找失败时做插入操作并保持表 r的有序性。【分析】:用二分查找方法,如查找成功,则返回待查元素在表中的位置,如果查找不成功,

40、既 lowhigh 时,此时 high+1 的位置为待查元素所应插入的位置,这样可以保持表r 的有序性。【答案】:#define M 500typedef struct int key; char info; NODE;NODE rM;int binsrch_insert(int n,int k) /* k 为要查找的数据,n 为实际的表长 */int low,high,mid,k; NODE temp;low=1; high=n;while(low=high+1;k-)rk+1=rk; /*从 rhigh+1到 rn的所有元素右移一个位置*/ rhigh+1.key=k; rhigh+1.i

41、nfo=;/* 数据插入 */35设记录的关键字集合为 K=(32,13,49,55,22,39,17) ,用模除散列函数得到散列地址,解决冲突的办法为线性探测法,按上述条件将集合中的各值依次添如下表中。【答案】:36选取散列函数H(key)=(3*key)% 11,用线性探测法处理冲突,对下列关键码序列构造一个散列地址空间为 0 10,表长为 11 的散列表,(22,41,53,08,46,30,01,31,66) 。37关键字序列 T=13,6,3,31,9,27,5,11,分别写出选择排序和直接插入排序的中间过程序列。【答案】:(1)选择排序:初始序列: 13 6 3 31 9 27 5

42、 11 /*T1与 T3交换 */完成第一趟: 3 6 13 31 9 27 5 11 /*T2与 T7交换 */完成第二趟: 3 5 13 31 9 27 6 11 /*T3与 T7交换 */完成第三趟: 3 5 6 31 9 27 13 11 /*T4与 T5交换 */完成第四趟: 3 5 6 9 31 27 13 11 /*T5与 T8交换 */完成第五趟: 3 5 6 9 11 27 13 31 /*T6与 T7交换 */完成第六趟: 3 5 6 9 11 13 27 31 /*不用交换 */完成第七趟: 3 5 6 9 11 13 27 31(2)直接插入排序:初始序列: 13 6

43、3 31 9 27 5 11第一趟: 13 6 3 31 9 27 5 1132 49 39 17 13 22 550 1 2 3 4 5 6 722 01 41 30 66 53 46 310 1 2 3 4 5 6 7 8 9 10 0819第二趟: 6 13 3 31 9 27 5 11第三趟: 3 6 13 31 9 27 5 11第四趟: 3 6 13 31 9 27 5 11第五趟: 3 6 9 13 31 27 5 11第六趟: 3 6 9 13 27 31 5 11第七趟: 3 5 6 9 13 27 31 11第八趟: 3 5 6 9 11 13 27 3138对于整数序列1

44、00,99,3,2,1,如果将它完全倒过来,分别用冒泡排序和快速排序法,它们的比较次数和交换次数各是多少?【答案】:对冒泡排序方法来说,这个序列是最坏的情况,n=100 个数据,共进行 99 趟排序操作,第一趟要比较99 次,第二趟要比较98 次,第 99 趟要比较 1 次,每一次比较都执行了一次交换,所以共进行了99+98+97+1=100*99/2=4950 次比较和交换。对快速排序方法来说,这个序列也是最坏的情况,与冒泡排序一样,共进行 99 趟排序。第一趟要比较99 次,进行一次交换,第二趟要比较98 次,不需要交换,第三趟要比较97 次,进行一次交换,第四趟要比较96 次,不需要交换

45、,所以总的比较次数为4950 次,交换的次数为50 次。39对关键码值为35,11,52, 69, 6, 17, 76,64 ,82的序列执行以下排序算法,画出执行过程中每个中间状态和结束时的状态:(1)直接插入排序;(2)二分插入排序;(3)直接选择排序;(4)冒泡排序;(5)快速排序。【答案】:(1)直接插入排序:初始序列: 35 11 52 69 6 17 76 64 82第一趟: 35 11 52 69 6 17 76 64 82第二趟: 11 35 52 69 6 17 76 64 82第三趟: 11 35 52 69 6 17 76 64 82第四趟: 11 35 52 69 6

46、17 76 64 82第五趟: 6 11 35 52 69 17 76 64 82第六趟: 6 11 17 35 52 69 76 64 82第七趟: 6 11 17 35 52 69 76 64 82第八趟: 6 11 17 35 52 64 69 76 82第九趟: 6 11 17 35 52 64 69 76 82(2)二分插入排序:与直接插入排序类似,只是在找插入位置时用二分查找方法。(3)直接选择排序:初始序列: 35 11 52 69 6 17 76 64 82 第一趟: 6 11 52 69 35 17 76 64 82 第二趟: 6 11 52 69 35 17 76 64 8

47、2 第三趟: 6 11 17 69 35 52 76 64 82 第四趟: 6 11 17 35 69 52 76 64 82 第五趟: 6 11 17 35 52 69 76 64 82 20i ji ji ji ji ji=ji j i ji j i ji= j i ji=ji j i j i ji= j i j i= j第六趟: 6 11 17 35 52 64 76 69 82 第七趟: 6 11 17 35 52 64 69 76 82 第八趟: 6 11 17 35 52 64 69 76 82 (4)冒泡排序:初始序列: 35 11 52 69 6 17 76 64 82第一趟:

48、 11 35 52 6 17 69 64 76 82 /* 4 次交换 */第二趟: 11 35 6 17 52 64 69 76 82 /* 3 次交换 */第三趟: 11 6 17 35 52 64 69 76 82 /* 2 次交换 */第四趟: 6 11 17 35 52 64 69 76 82 /* 1 次交换 */第五趟: 6 11 17 35 52 64 69 76 82 /* 没有任何交换,完成*/ (5)快速排序:初始序列: 35 11 52 69 6 17 76 64 82 /* 初始化 i=1,j=9 */第一次交换: 17 11 52 69 6 35 76 64 82 /* j=6 时与 35 交 换 */第二次交换: 17 11 35 69 6 52 76 64 82 /* i=3 时与 35 交换 */第三次交换: 17 11 6

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报