数据结构习题及答案 下载本文

第1章 数据结构

一、选择题

1.算法指的是()。

A计算机程序 B解决问题的计算方法

C排序方法 D解决问题的有限运算序列

2.在数据的树形结构中,数据元素之间为( )的关系。 A 0:0 B 1:1 C 1:n D m:n

3.数据的存储结构包括顺序、链接、散列和( )4种基本类型。 A索引 B数组 C集合 D向量 4.一个数组元素a[i]与( )的表示等价。

A &a+i B *(a+i) C *a+i D a+i

5.若只需要利用形参间接访问实参指针所指向的对象,而形参本身具有相应的存储空间,则应把形参变量说明为( )参数。 A指针 B引用 C值 D指针引用

6.若只需要利用形参实现对实参值的拷贝,函数体操作形参时与实参无关,则应把形参变量说明为( )参数。

A指针 B引用 C值 D指针引用 7.下面程序的时间复杂性的量级为()。 int i=0,s1=,s2=0; while(i++

else s2+=i; }

A.O(1) B.O(1bn) C.O(n) D.O(2n) 8.下面程序段的时间复杂度为( )。 for(int i=0;i

a[i][j]=i*j;

A.O(m2) B.O(n2) C.O(m+n) D.O(m*n)

9.执行下面程序段时,S语句的执行次数为()。 for(int i=1;i<=n;i++) for(int j=1,j<=i;j++)

S;

A.n(n-1)/2 B.n(n+1)/2 C.n2/2 D.n

10.在一个长度为n的顺序存储结构的线性表中,向第i个元素(1≤i≤n+1)位置插入一个元素时,需要从后向前依次后移()个元素。

A.n-i B.n-i+l C.n-i-l D.i

11. 在一个长度为n的顺序存储结构的线性表中,删除第i个元素(1≤i≤n+1)时,需要从前向后依次后移()个元素。

A.n-i B.n-i+l C.n-i-l D.i

12.在一个长度为n的线性表中,删除值为x的元素时需要比较元素和移动元素的总次数为()。

A.(n+1)/2 B.n/2 C.n D.n+1

13.在一个顺序表的表尾插入一个元素的时间复杂度为()。

A. O(n) B. O(1) C. O(n*n) D. O(lbn)

14.在一个顺序表中的任何位置插入一个元素的时间复杂度为()。

A. O(n) B. O(n/2) C. O(1) D. O(n2)

15.在一个单链表中删除p所指向结点的后继结点时,其算法的时间复杂度为()。 A. O(n) B. O(n/2) C. O(1) D. O(n2)

16.线性表的链式存储比顺序存储更有利于进行()操作。 A.查找 B.表尾插入和删除

C.按值插入和删除 D.表头的插入和删除

17.线性表的顺序存储比链式存储更有利于进行()操作。 A.查找 B.表尾插入和删除 C.按值插入和删除 D.表头的插入和删除

18.在一个单链表中,若要在P所指向的结点之后插入一个新结点,则需要相继修改()个指针域的值.

A.1 B.2 C.3 D.4

19.在一个带头结点的循环双向链表中,若要在P所指向的结点之前插入一个新结点,则需要相继修改()个指针域的值。

A.2 B.3 C.4 D.6

20.在一个表头指针为ph的单链表中,若要向表头插入一个由指针p指向的结点,则应执行()操作。

A. ph=p; p->next=ph; B. p->next=ph; ph=p;

C. p->next=ph; p=ph; D. p->next=ph->next; ph->next=p; 21.在一个表头指针为ph的单链表中,若要在指针q所指结点的后面插入一个由指针p所指向的结点,则执行()操作。

A. q->next=p->next; p->next=q; B. p->next=q->next; q=p;

C. q->next=p->next; p->next=q; D. p->next=q->next; q->next=p;

22.在一个单链表HL中,若要删除由指针q所指向结点的后继结点(若存在的话),则执行()操作。

A. p=q->next; p->next=q->next; B. p=q->next; q->next=p;

C. p=q->next; q->next=p->next; D. q->next=q->next->next; q->next=q;

23.在一个带头结点的循环双向链表中,若要在指针p所指向的结点之后插入一个q指针所指向的结点,则需要对q->next赋值为()。 A. P->prior B. p->next

C. p->next->next D.p->prior->prior

24.在一个带头结点的循环双向链表中,若要在指针p所指向的结点之前插入一个q指针所指向的结点,则需要对p->prior->next赋值为()。

A. q B. p C. p->next D. p->prior

25. 在一个带头结点的循环双向链表中,若要删除指针p所指向的结点则执行()操作。 A. p->prior->next=p->next; p->next->prior=p->prior; B. p->next->prior=p; p->next=p->next->next; C. p->prior->next=p; p->next=p->next->prior;

D. p=p->next; p->prior->next=p->prior; 26.栈的插入和删除操作在()进行。

A. 栈顶 B. 栈底C. 任意位置D. 指定位置

27.当利用大小为N的数组顺序存储一个栈时,假定用top==N表示栈空,则向这个栈插入

一个元素时,首先应执行()语句修改top指针。

A.top++ B.top-- C.top=0 D.top=N-1

28.假定利用数组a[N]顺序存储一个栈,用top表示栈顶指针,用top=N+1表示栈空,该数组所存储的栈的最大长度为N,则表示栈满的条件为()。 A.top==1 B.top==-1 C.top=0 D.top=N-1

29. 假定利用数组a[N]顺序存储一个栈,用top表示栈顶指针,用top==-1表示栈空,并已知栈未满,当元素x进栈时所执行的操作为()。 A.a[--top]=x B.a[top--]=x C.a[++top]=x D.a[top++]=x

30. 假定利用数组a[N]顺序存储一个栈,用top表示栈顶指针,用top==-1表示栈空,并已知栈未空,当退栈并返回栈顶元素时所执行的操作为()。

A return a[--top] B return a[top--] C return a[++top] D return a[top++] 31.假定一个链式栈的栈顶指针用top表示,该链式栈为空的条件()。

A.top!=NULL; B. top==top->next; C. top== NULL; D. top!= top->next;

32.假定一个链式栈的栈顶指针用top表示,每个结点结构为,当p所指向的结点进栈时,执行的操作为()。

A. p->next=top; top=top->next; B. top=p; p->next=top;

C. p->next=top->next; top->next=p; D. p->next=top; top=p;

33.假定一个链式栈的栈顶指针用top表示,每个结点结构为,退栈时所执行的操作为()。 A.top->next=top;B.top=top->data;

C.top=top->next; D. top->next=top->next->next;

34.若让元素1,2,3,4依次进栈,则出栈次序不可能出现( )的情况。 A.3,2,1,4 B.2,1,4,3 C.4,3,2,1 D.1,4,2,3.

35.在一个顺序循环队列中,队首指针指向队首元素的()位置。 A前一个 B后一个 C当前 D最后

36.当利用大小为N的数组循环存储一个队列时,该队列的最大长度为()。 A.N-2 B.N-1 C.N D.N+1

37.从一个顺序循环队列中删除元素时,首先需要()。 A.前移队首指针 B.后移队首指针

C.取出队首指针所指位置上的元素 D.取出队尾指针所指位置上的元素

38.假定一个顺序循环队列的队首和队尾指针分别用f和r表示,则判断队空的条件为()。 A.f+1==r B.r+1==f C.f==0 D.f==r 39.假定一个顺序循环队列存储于数组a[N],其队首和队尾指针分别用f和r表示,则判断队满的条件为()。 A.(r-1)%N==f B.(r+1)%N==f C.(f-1)%N==r D.(f+1)%N==r 40.假定利用数组a[N]循环顺序存储一个队列,其队首和队尾指针分别用f和r表示,并已知队列未满,当元素x入列时所执行的操作为()。

A.a[++r%N]=x B.a[r++%N]=x C.a[--r%N]=x D.a[r--%N]=x 41.假定利用数组a[N]循环顺序存储一个队列,其队首和队尾指针分别用f和r表示,并已知队列未空,当出列并返回队首元素时所执行的操作为()。

A.return a[++r%N] B.return a[--r%N] C.return a[++f%N] D.return a[f++%N]

42.假定一个链式队列的队首和队尾指针分别为front和rear,则判断队空的条件为()。 A.front==rear B.front!=NULL C.rear!=NULL D.front==NULL 43.假定一个链式队列的队首和队尾指针分别为front和rear,每个结点结构为,当出列时所进

行的操作为()。

A.front=front->next B.rear=rear->next C.front->next =rear;rear=rear->next D.front=front->next;front->next =rear;

44.假定一个带头结点的循环链式队列的队首和队尾指针分别用front和rear表示,则判断对空的条件为()。

A.front=rear->next B.rear==NULL C. front==NULL D. front ==rear

45.假定一个链式队列的队首和队尾指针分别为front和rear,每个结点结构为包含值域data和指针域next,则使p所指结点入列所执行的操作为()。 A.p->next=NULL;rear=rear->next=p; B.p->next=rear->next;rear=rear->next=p; C.p->next=front;front=p;

D.p->next=front->next;front->next=p;

46.在一个长度为N的数组空间中,循环顺序存储着一个队列,该队列的队首和队尾指针分别用front和rear表示,则该队列中数组元素个数为()。 A.(rear-front)%N B.(rear-front+N)%N

C.(rear+N)%N D.(front+N)%N

47.二维数组A[12,10]采用行优先存储,每个数据元素占用4个存储单元,该数组的首地址(即A[0,0]的地址)为1200,则A[6,5]的地址为()。 A.1400 B.1404 C.1372 D.1460

48.有一个M×N的矩阵A,若采用行优先进行顺序存储,每个元素占用8个字节,则Aij(1≤i≤M,1≤j≤N)元素的相对字节地址(相对首元素地址而言)为()。 A.((i-1)×N+j)×8 B.((i-1)×N+j-1)×8 C.(i×N+j-1)×8 D.((i-1)×N+j+1)×8

49.有一个N×N的下三角矩阵A,若采用行优先进行顺序存储,每个元素占用k个字节,则Aij(1≤i≤N,1≤j≤i)元素的相对字节地址(相对首元素地址而言)为()。 A.(i×(i+1)/2+j-1)×4 B.(i×i/2+j)×4 C.(i×(i-1)/2+j-1)×4 D.(i×(i-1)/2+j)×4 50.树中所有结点的度等于所有结点数加()。 A.0 B.1 C.-1 D.2 51.在一棵树中,()没有前驱结点。

A.树枝结点 B.叶子结点 C.树根结点 D.空结点 52.在一棵树中,每个结点最多有()个前驱结点。 A.0 B.1 C.2 D.任意多个

53.在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加()。 A.2 B.1 C.0 D.-1

54.在一棵具有n个结点的二叉树中,所有结点的空子树个数等于()。 A.n B.n-1 C.n+1 D.2n

55.在一棵具有n个结点的二叉树的第i层上,最多具有()个结点。 A.2i B.2i+1 C.2i-1 D.2n

56.在一棵深度为h的完全二叉树中,所含结点个数不小于()。 A.2h B.2h+1 C.2h-1 D.2h-1

57.在一棵深度为h的完全二叉树中,所含结点个数不大于()。 A.2h B.2h+1 C.2h-1 D.2h-1

58.在一棵具有35个结点的完全二叉树中,该树的深度为()。

A.6 B.7 C.5 D.8

59.在一棵完全二叉树中,若编号为i的结点存在左孩子,则左孩子结点编号为()。 A.2i B.2i-1 C.2i+1 D.2i+2

60.在一棵完全二叉树中,若编号为i的结点存在右孩子,则右孩子结点编号为()。 A.2i B.2i-1 C.2i+1 D.2i+2

61.在一棵完全二叉树中,对于编号为i(i>1)的结点其双亲结点的编号为()。 A.(i+1)/2 B.(i-1)/2 C.i%2 D.i/2

62.有如图1.1所示的一棵二叉树,则该二叉树所含单支结点数为()。 A.2 B.3 C.4 D.5

63.有如图1.2所示的一棵二叉树,则该二叉树的中序遍历序列为()。 A. ABCDEFG B. CDBGFEA C. CBDAEGF D. ABECDFG

64.有如图1.2所示的一棵二叉树,则该二叉树的先序遍历序列为()。 A.ABCDEFG B.CDBGFEA C.CBDAEGF D.ABECDFG

65.有如图1.2所示的一棵二叉树,则该二叉树的后序便利序列为()。 A.ABCDEFG B.CDBGFEA C.CBDAEGF D.ABECDFG 66.利用n个值生成的哈夫曼树中共有()个结点。

A.n B.n+1 C.2n D.2n-1

67.利用3,6,8,12这4个值作为叶子结点的权,生成一棵哈夫曼树,该树的带权路径长度为()。

A.55 B.29 C.58 D.38

68.在一个具有n个顶点的有向图中,若所有顶点的出度数之和为s,则所有的入度数之和为()。 A.s B.s-1 C.s+1 D.n

69.在一个具有n个顶点的有向图中,若所有顶点的出度数之和为s,则所有的度数之和为()。 A. s B. s -1 C. s +1 D.2s

70.在一个具有n个顶点的无向图中,若具有e条边,则所有顶点的度数为()。 A.n B.e C.n+e D.2e

71.在一个具有n个顶点的无向完全图中,所含的边数为()。 A.n B.n(n-1) C.n(n-1)/2 D.n(n+1)/2 72.在一个具有n个顶点的有向完全图中,所含的边数为()。 A.n B.n(n-1) C.n(n-1)/2 D.n(n+1)/2

73.在一个具有n个顶点的无向连通图中,它包含的连通分量的个数为()。 A.0 B.1 C.n D.n+1

74.若有一个图中包含k个连通分量,若按照深度优先搜索的方法访问所有顶点,则必须调用()次深度优先搜索遍历的算法。

A.k B.1 C.k-1 D.k+1

75.若要把n个顶点连接为一个连通图,则至少需要()条边。 A.n B.n+1 C.n-1 D.2n

76.在一个具有n个顶点和e条边的无向图的邻接矩阵中,表示边存在的元素(又称为有效元素)的个数为()。 A.n B.ne C.e D.2e

77.在一个具有n个顶点和e条边的有向图的邻接矩阵中,表示边存在的元素的个数为()。 A.n B.ne C.e D.2e

78.在一个具有n个顶点和e条边的无向图的邻接矩阵中,边结点的个数为()。

A.n B.ne C.e D.2e

79.对于一个有向图,若一个顶点的度为k1,出度为k2,则对应邻接表中该顶点单链表的边数结点为()。 A.k1 B.k2 C.k1-k2 D.k1+k2

80.对于一个有向图,若一个顶点的度为k1,出度为k2,则对应逆邻接表中该顶点单链表的边数结点为()。 A.k1 B.k2 C.k1-k2 D.k1+k2

81.对于一个无向图,下面()的说法是正确的。

A.每个顶点的入度等于出度 B.每个顶点的度等于入度和出度之和 C.每个顶点的入度为0 D.每个顶点的出度为0

82.在一个有向图的邻接表中,每个顶点单链表中结点的个数等于该顶点的()。

A.出边数 B.入边数 C.度数 D.度数减一 83.若一个图的边集为{(A,B)(A,C)(B,D)(C,F)(D,E)(D,F)},则从顶点A开始对该图进行深度优先搜索,得到的顶点序列可能为()。

A. ABCFDE B. ACFDEB C. ABDCFE D. ABDFEC 84.若一个图的边集为{(A,B)(A,C)(B,D)(C,F)(D,E)(D,F)},则从顶点A开始对该图进行广度优先搜索,得到的顶点序列可能为()。 A.ABCDEF B.ABCFDE C.ABDCEF D.ACBFDE 85.若一个图的边集{(1,2)(1,4)(2,5)(3,1)(3,5)(4,3)},则从顶点1开始对该图进行深度优先搜索,得到的顶点序列可能为()。 A.1,2,5,4,3 B.1,2,3,4,5 C.1,2,5,3,4 D.1,4,3,2,5 86.若一个图的边集{(1,2)(1,4)(2,5)(3,1)(3,5)(4,3)},则从顶点1开始对该图进行广度优先搜索,得到的顶点序列可能为()。

A. 1,2,3,4,5 B. 1,2,4,3,5 C. 1,2,4,5,3 D. 1,4,2,5,3 87.由一个具有n个顶点的连通图生成的最小树中有()条边。

A.n B.n-1 C.n+1 D.2n

88.若查找每一个元素的概率相等,则在长度为n的顺序表上查找任一元素的平均查找长度为()。 A. n B. n+1 C. (n-1)/2 D. (n+1)/2

89.对长度为n的单链有序表,若查找每个元素的概率相等,则查找任一个元素的平均查找长度为()。 A. n/2 B.(n+1)/2 C. (n-1)/2 D.n/4

90.对于长度为9的顺序存储的有序表,若采用二分查找,在等概率情况下的平均查找长度为()的值除以9。

A.20 B.18 C.25 D.22

91.对于长度为18的顺序存储的有序表,若采用二分查找,则查找第15个元素的查找长度为()。

A.2 B.3 C.4 D.6

92.对于顺序存储的有序表(5,12,20,26,37,42,46,50,64),若采用二分查找,则查找元素26的查找长度为()。 A.2 B.3 C.4 D.5

93.在分块查找中,若用于保存数据元素的主表长度为n,它被分为k个子表,每个子表的长度均为n/k,若用顺序查找确定块,则分块查找的平均查找长度为()。

A.n+k B.k+n/k C.(k+n/k)/2 D.(k+n/k)/2+1

94.在分块查找中,若用于保存数据元素的主表长度为144,它被分为12个子表,每个子表的长度均为12,若用顺序查找确定块,则分块查找的平均查找长度为()。 A.13 B.24 C.12 D.79

95.在一棵深度为h的具有n个元素的二叉排序树中,查找所有元素的最长查找长度为()。 A.n B.lbn C.(h+1)/2 D.h

96.在一棵平衡二叉排序树中,每个结点的平衡因子的取值范围是()。

A.-1~1 B.-2~2 C.1~2 D.0~1

97.若根据查找表(23,44,36,48,52,73,64,58)建立线性哈希表,采用H(K)=K计算哈希地址,则元素64的哈希地址为()。

A.4 B.8 C.12 D.13

98.若根据查找表(23,44,36,48,52,73,64,58)建立线形哈希表,采用H(K)=K计算哈希地址,则哈希地址为3的元素个数为()。 A.1 B.2 C.3 D.4

99.若根据查找表建立长度为m的线性哈希表,采用线性探测再哈希法处理冲突,假定对一个元素第一次计算的哈希地址为d,则下一次的哈希地址为()。 A.d B.d+1 C.(d+1)/m D.(d+1)%m

100.在采用线性探测再哈希法处理冲突的线性哈希表上,假定装填因子a的值为0.5,则查找任一个元素的平均查找长度为()。 A.1 B.1.5 C.2 D.2.5

101.在哈希查找中,平均查找长度主要与()有关。

A.哈希表长度 B.哈希元素个数 C.装填因子 D.处理冲突方法 102.若对n个元素进行直接插入排序,则进行第i趟排序过程前,有序表中元素的个数为()。 A.i B.i+1 C.i-1 D.1

103.若对n个元素进行直接插入排序,在进行第i趟排序时,为寻找插入位子最多需要进行()次元素的比较,假定第0号元素放有待查的键值。

A. i B.i-1 C.i+1 D.1

104.若对n个元素进行直接插入排序,在进行第i趟排序时,假定元素r[i+1]的插入位置为r[j],则需要移动元素的次数为()。 A.j-i B.i-j-1 C.i-j D.i-j+1

105.若对n个元素进行直接插入排序,在进行任意一趟排序的过程中,为寻找插入位置而需要的时间复杂度为()。 A.O(1) B.O(n) C.O(n2) D. O(lbn)

106.在对n个元素进行直接插入排序的过程中,共需要进行()趟。 A.n B.n+1 C.n-1 D.2n

107.对n个元素进行直接插入排序的时间复杂度为()。 A.O(1) B.O(n) C.O(n2) D. O(lbn)

108.在对n个元素进行冒泡排序的过程中,第一趟排序至多进行()对相邻元素之间的交换。 A .n B.n-1 C.n+1 D.n/2

109.在对n个元素进行冒泡排序的过程中,最坏情况下的时间复杂度为()。 A.O(1) B.O(lbn) C.O(n2) D.O(n)

110.在对n个元素进行冒泡排序的过程中,至多需要()趟完成。 A .1 B.n C.n-1 D.n/2

111.在对n个元素进行快速排序的过程中,最好情况下需要进行()趟。

A.n B.n/2 C.lbn D.2n

112.在对n个元素进行快速排序的过程中,最坏情况下需要进行()趟。

A.n B.n-1 C.n/2 D.lbn

113.对下列4个序列进行快速排序,各以第一个元素为基准进行第一次划分,则在该次划分过程中需要移动元素次数最多的序列为()。 A.1,3,5,7,9 B.9,7,5,3,1 C.5,3,1,7,9 D.5,7,9,1,3

114.假定对元素序列(7,3,5,9,1,12,8,15)进行快速排序,则进行第一次划分后,得到的左区间中元素的个数为()。 A.2 B.3 C.4 D.5

115.在对n个元素进行简单选择排序的过程中,在第i趟需要从()个元素中选择出最小值元素。

A.n-i+1 B.n-i C.i D.i+1

116.若对n个元素进行简单选择排序,则进行任一趟排序的过程中,为寻找最小值元素所需要的时间复杂度为()。 A.O(1) B.O(lbn) C.O(n2) D. O(n)

117.假定一个初始堆为(1,5,3,9,12,7,15,10),则进行第一趟堆排序后得到的结果为()。

A.3,5,7,9,12,10,15,1 B.3,5,9,7,12,10,15,1 C.3,7,5,9,12,10,15,1 D.3,5,7,12,9,10,15,1 118.若一个元素序列基本有序,则选用()方法较快。 A.直接插入排序 B.简单选择排序 C.堆排序 D.快速排序

119.若要从1000个元素中得到10个最小元素,最好采用()方法。 A.直接插入排序 B.简单选择排序 C.堆排序 D.快速排序 120.在平均情况下速度最快的排序方法为()。

A.简单选择排序 B.冒泡排序 C.堆排序 D.快速排序

二﹑填空题

1.数据的逻辑结构可分为____和____两大类。

2.数据的存储结构被分为____,_____,_____和____4种。

3.在下面的程序段中,s=s+p语句被执行次数为____,p*=j语句的执行次数为____,该程序的复杂度为____。 int i=0,s=0; while(++i<=n) { int p=1;

for(int j=1;j<=i;j++) p*=j; s=s+p;

}

4.一种数据结构的元素集合K和它的二元关系R为:K={a,b,c,d,e,f,g,h} R={} 则该数据结构具有____结构。

5.线性表的两种存储结构分别为____和____。

6.线性表的顺序存储结构称为____,链式存储结构称为____。

7.若经常需要对线性表进行插入和删除运算,则最好采用__存储结构,若经常需要对线性表

进行查找运算,则最好采用____存储结构。

8.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为____。

9.对于一个单链表存储的线性表,在表头插入结点的时间复杂度为____,在表尾插入结点的时间复杂度为____。

10.在线性表的单链表存储中,若一个元素所在结点的地址为p,则其后的断结点的地址为____。

11.在以HL为头指针的带头结点的单链表和循环单链表中,链表为空的条件分别为____和____。

12.在____链表中,既可以通过设定一个头指针,也可以通过设定一个尾指针来确定它,即通过头指针或尾指针可以访问到该链表的每个结点。

13.在一个单链表中删除指针p所指向结点的后继结点时,需要把____的值赋给p->next指针域。

14.在一个单链表中指针p所指向结点的后面插入一个指针q所指向的节点时,首先把____的值赋给p->next,然后把____的值赋给p->next。

15.假定指向单链表中第一个结点的头指针为head,则像该单链表的表头插入指针p所指向的新结点时,首先执行____赋值操作,然后执行____赋值操作。

16.访问一个顺序表和一个单链表中第i个元素的时间复杂度分别为____和____。

17.在一个带头结点的循环单链表中,在表头插入或删除与在其它位置插入和删除,其操作过程是否相同?________。

18.在双向链表中每个结点包含有两个指针域,一个指向其____结点,另一个指向其____结点。

19.在一个双向链表中指针p所指向的结点之后插入一个指针q所指向的结点时,需要对p->next->prior指针域赋值为____。

20.在一个双向链表中删除指针p所指向的结点时,需要对p->next->prior指针域赋值为____。 21.栈又称为____表,队列又称为____表。

22.在一个用一维数组a[N]表示的顺序栈中,该栈所含元素的个数最少为____个,最多为____个。

23.像一个顺序栈插入一个元素时,首先使____后移一个位置,然后把新元素____到这个位子。

24.从一个栈删除元素时,首先取出____,然后再使____减一。

25.一个顺序栈存储一个一维数组a[M]中,栈顶指针用top表示,当栈顶指针等于____时为空栈,栈顶指针为____时为满栈。

26.假定一个链栈的栈顶指针为top,每个结点包含值域data和指针域next,当p所指向的结点入栈时,则首先执行____操作,然后执行____操作。

27. 假定一个链栈的栈顶指针为top,每个结点包含值域data和指针域next,当进行出栈运算时(假定栈非空),需要把栈顶指针修改为____的值。 28.设元素1,2,3,4,5依次进栈,若要在输出端得到序列34251,则应进行的操作序列为Push(s,1),Push(s,2),____,Pop(s),Push(s,4),Pop(s),____,____,Pop(s),Pop(s)。

29.设元素a,b,c,d依次进栈,若要在输出端得到序列cbda,则应进行的操作序列为push(s,a),push(s,b),push(s,c),____,____,____pop(s),pop(s)。 30.队列的插入操作在____进行,删除操作在____进行。

31.一个顺序循环队列存在于a[M]中,假定队首和队尾指针分别为front和rear,则判断对空的条件为____,判断对满的条件为____。

32.一个顺序循环队列存在于a[M]中,假定队首和队尾指针分别为front和rear,则求出队首和

队尾指针的下一个位置的计算公式分别为________和________。

33.在一个用一维数组a[N]存储的顺序循环队列中,该队列中的元素个数最少为____个,最多为____个。

34.向一个顺序循环队列中插入元素时,需要首先移动____,然后再向它所指位置____新元素。

35.在一个空链队列中,假定队首和队尾指针分别为f和r,当向他插入一个新结点*p时,则首先执行____操作,然后执行____操作。

36.在一个带头结点的循环链队列中,假定队首和队尾指针分别为f和r,当向它插入一个新结点*p时,则首先执行____操作,然后执行____操作。

37.假定front和rear分别为一个链队列的对首和队尾指针,则该链队列中只有一个结点的条件为________。

38.在一个链栈中,若栈顶指针等于NULL则为____;在一个链队列中,若对首和队尾的指针相同,则表示该队列为____或该队列____。

39.一个二维数组A[15,10]采用行优先方式存储,每个数据元素占用4个存储单元,以该数组第3列第0行的地址(即A[3,0]的地址)1000为首地址,则A[12,9]的地址为____。 40.在二维数组a[10,20]中,每个元素占8个存储单元,假定该数组的首地址为2000,则数组元素a[6,15]的字节地址为____。 41.有一个8×8的下三角矩阵A,若将其进行顺序存储于一维数组a[N]中,则N的值为____。 42.有一个10×10的下三角矩阵A,若将其进行顺序存储于一维数组a[N]中,则Aij(1≤i≤10,1≤j≤i)存储于a中的下标位置为____。

43.有一个8×8的下三角矩阵A,若将其进行顺序存储,每个元素占用4个字节,则A5,4元素的相对字节地址为(相对首元素地址而言)____。 44.一种数据结构的元素集合K和它的二元关系R为:

K={a,b,c,d,e,f,g,h}

R={}则该数据结构具有____结构。 45.对于一棵具有n个结点的树,则该树中所有结点的度数之和为____。

46.在一棵树中,____结点没有前驱结点,其余每个结点有并且只有一个____,可以有人以多个____结点。

47.如图1.3所示为一棵树,该树的叶子结点数为____个,单支结点数为____个,双分支结点数为____个,三分支结点数为____个。

48.如图1.3所示的一棵树,结点K的所有祖先的结点数为____个,结点B的所有子孙结点数为____个。

49.如图1.3所示的一棵树,结点D和X的层数分别为____和____。 50.如图1.4所示的一棵树,则树中所含的结点数为____个,树的深度为____,树的度为____。 51.如图1.4所示的一棵树,则度为3,2,1,0的结点数分别为____,____,____。 52.如图1.4所示一棵树,则结点H的双亲为____,孩子结点为____。

53.在一棵二叉树中,假定双分支结点数为5个,单分支结点数为6个,则叶子结点数为____。 54.对于一棵二叉树,若一个结点的编号i,若它的左孩子结点存在,则其编号为____,若右孩子结点存在,则其编号为____,若双亲结点存在,则其编号为____。 55.在一棵二叉树中,第5层上的结点数最多为____。

56.假定一棵二叉树的结点数为18,则它的最小深度为____,最大深度为____。

57.如图1.5所示为一棵二叉树,则E结点的双亲结点数为____,左孩子结点为____,右孩子结点为____。

58.如图1.5所示为一棵二叉树,它含有双支结点____个,单分支结点____个,叶子结点____

个。

59.假定一棵二叉树顺序存储在一维数组a中,若a[5]元素的左孩子存在则对应的元素为____,若右孩子存在则对应的元素为____,双亲元素为____。

60.若对一棵二叉树从0开始进行结点编号,并按此编号把它存储到一维数组a中,即编号为0的结点存储到a[0]中,依次类推,则a[i]元素的左孩子为____,右孩子为____,双亲元素(i>0)为____。

61.对于一棵具有n个结点的二叉树,对应____二叉链表中指针总数为____个,其中____个用于指向孩子结点,____个指针空闲。

62.在一棵深度为h的完全平衡二叉树中,最少含有____个结点,最多含有____个结点。 63.一棵深度为5的完全二叉树中的结点数最少为____个,最多为____个。 64.如图1.6所示为一棵二叉树,对它进行先序遍历结果为____。

65.若将如图1.7所示为一棵树转换为二叉树,该二叉树中双支结点的个数为____个,单支结点的个数为____个,叶子结点个数为____。

66.一棵树转换为二叉树后如图1.8所示,则原树中分支结点数为____,叶子结点数为____。 67.一个树林转换成二叉树后如图1.9所示,则该素林中包含____棵树。

68.若由3,6,8,12,10作为叶子结点的值生成一棵哈夫曼树,则该树的深度为____,带权路径长度为____。

69.一种数据结构的元素集合K和它的二元关系R为:K={1,2,3,4,5,6} R={(1,2)(2,3)(2,4)(3,4)(3,5)(3,6)(4,5)(4,6)} 则该数据结构具有____数据结构。

70.在一个图中,所有顶点的度数之和等于所有边数的____倍。

71.在一个具有n个顶点的无向完全图中,包含有____条边,在一个具有n个顶点的有向完全图中,包含有____条边。

72.已知一个连通图的边集为{(1,2),(1,3),(1,4),(2,3),(2,5),(3,5),(4,5)},则度为3的顶点的个数有__个。

73.假定一个有向图的顶点的集为{a,b,c,d,e,f},边集{},则出度为0的顶点个数为__,入度为1的顶点个数为__。

74.在一个具有n个顶点的无向图中,要连通所有顶点则至少需要__条边。 75.表示图的两种存储结构为__和__。 76.在一个连通图中存在着__个连通分量。

77.若一个图的顶点集为{a,b,c,d,e,f},边集为{(a,b),(a,c),(b,c),(d,e)},则该图含有__个连通分量。

78.若一个图的边集为{<0,1>,<0,2>,<0,3>,<0,4>,<1,2>,<2,4>,<3,4>},则从顶点V0到顶点V4共有__条简单路径。

79.如图1.10所示为一个带权有向图,从顶点V0到顶点V4的最短路径长度为__。 80.对于一个具有n个顶点的图,若采用邻接矩阵表示,则矩阵大小至少为__×__。 81.对于一个具有n个顶点和e条边的有向图和无向图,在其对应的邻接表中,所含边结点的个数分别为__和__。

82.在有向图的邻接表和逆邻接表表示中,每个顶点邻接表分别链接着该顶点的所有__和__。

83.有一个图的边集为{(a,c),(a,e),(b,e),(c,d),(d,e)},从顶点a出发进行深度优先搜索遍历得到的顶点序列为____,从顶点a出发进行广度优先搜索遍历得到的顶点序列为____。

84.一个图的边集为{(a,c),(a,e),(c,f),(d,c),(e,b),(e,d)},从顶点a出发出发进行深

度优先搜索遍历得到的顶点序列为____,从顶点a出发进行广度优先搜索遍历得到的顶点序列为____。

85.图的__优先搜索遍历算法是一种递归算法,图的__优先搜索遍历算法需要使用队列。 86.若一个连通图中每个边上的权值均不同,则得到的最小生成树是__(唯一/不唯一)。 87.以顺序查找方法从长度为n的顺序表或单链表中查找一个元素时,平均查找长度为__。 88.对长度为n的查找表进行查找时,假定查找第i个元素的概率为P,查找长度(即在查找过程中依次同有关元素比较的总次数)为C,则在查找成功的情况下的平均查找长度的计算公式为____。

89.假定一个顺序表的长度为40,并假定查找每个元素的概率都相同,则在查找成功的情况下的平均查找长度__,则在查找不成功的情况下的平均查找长度__。

90.以折半查找方法从长度为n的有序表中查找一个元素时,平均查找长度约等于__减一。 91.以折半查找方法从长度为50的有序表中查找一个元素时,其查找长度不超过__。 92.从有序表(12,18,30,43,56,78,82,95)中分别折半查找43和56元素时,其查找长度分别为__和__。

93.假定对长度n=50的有序表进行折半查找,则对应的判定树深度为__,最后一层的结点数为__。

94.在分块查找中,假定查找表(即主表)的长度为96,被等分为8个子表,则进行分块查找的平均查找长度为__。

95.假定对长度为n的有序表进行分块查找,并假定每个子表的长度为,则进行分块查找的平均查找长度为__。

96.在一棵二叉树排序中,每个分支结点的左子树上所有结点的值一定__该结点的值,右子树上所有结点的值一定__该结点的值。

97.从一棵二叉排序树中查找某个元素时,若元素的值等于根结点的值,则表明__,若元素的值小于根结点的值,则继续向__查找,若元素的值大于根结点的值,则继续向__查找。

98.向一棵二叉排序树种插入一个元素时,若元素的值小于根结点的值,则接着向根结点的__插入,若元素的值大于根结点的值,则接着向根结点的__插入。

99.在一棵平衡二叉排序树中,每个结点的左子树深度与右子树深度之差的绝对值不超过__。

100.假定对线性表(38,25,74,52,48),进行散列存储,采用H(K)=K%7作为哈希函数,采用线性探测再散列法处理冲突,则在建立哈希表过程中,将会碰到__次冲突。 101.假定对线性表(38,25,74,52,48)进行散列存储,采用H(K)=K%7作为哈希函数,采用线性探测再散列法处理冲突,则平均查找长度为__。

102.在线性表的散列存储中,装填因子a又称装填系数,若用m表示散列表的长度,n表示散列存储的元素个数,则a等于__。

103.对线性表(18,25,63,50,42,32,90)进行散列存储时,若选用H(K)=K%9作为哈希函数,则散列地址为0的元素有__个,则散列地址为5的元素有__个。 104.每次从无序子表中取出一个元素,把它插入到有序子表的适当位置,此种排序方法叫做__排序;每次从无序子表中挑选出一个最小或最大元素,把它交换到有序表的一段,此种排序方法叫做__排序。

105.若对一组记录(46,79,56,38,40,80,35,50,74)进行直接插入排序,当把第8个记录插入到前面已排序的有序表时,为寻找插入位置需比较__次。 106.__排序方法能够每次使无序表中的第一个记录插入到有序表中。

107.对n个记录进行冒泡排序时,最少的比较次数为__,最少的趟数为__。

108.假定一组记录为(46,79,56,38,40,84),在冒泡排序过程中进行第一趟排序后的结果为__。

109.假定一组记录为(46,79,56,64,38,40,84,43),在冒泡排序过程中进行第一趟排序时,元素97将最终下沉到其后第__位置。

110.__排序方法使键值达的记录逐渐下沉,使键值小的记录逐渐上浮。

111.假定一组记录为(46,79,56,38,40,80)对其进行快速排序的过程中,共需要__趟。

112.假定一组记录为(46,79,56,25,76,38,40,80)对其进行快速排序的第一次划分后,右区间内元素个数为__。

113.假定一组记录为(46,79,56,38,40,80),对其进行快速排序的第一次划分后的结果为__。

114.在所有排序方法中,__排序方法采用的是折半查找法的思想。

115.在简单选择排序中,记录比较次数的时间复杂度为__,记录移动次数的时间复杂度为__。

116.若对一组记录(46,79,56,38,40,80,35,50,74)进行简单选择排序,用k表示最小值元素的下标,进行第一趟是可得初值为1,则在第一趟选择最小值的过程中,k的值被修改__次。

117.在时间复杂度为O(n2)的所有排序方法中,__排序方法使不稳定的。 118.假定一个堆为(38,40,56,79,46,84),则利用堆排序方法进行第一趟交换和对根结点筛运算后得到的结果为__。

119.在所有排序方法中,__方法使数据的组织采用的是完全二叉树的结构。 120.__排序方法能够每次从无序表中查找出一个最小值。

三、名词解释

1.数据 2.数据元素 3.数据对象 4.数据结构 5.逻辑结构 6.时间复杂度 7.空间复杂度 8.栈 9.队列 10.压缩存储 11.树形结构 12.结点的度

13.树的度 14.树的深度 15.有序树 16.遍历 17.哈夫曼树 18.邻接关系 19.路径 20.连通图

21.强连通图 22.完全无向图 23.完全有向图 24.主关键字

四、简答题

1.简述线性结构,树形结构,网状结构的不同。 2.简述算法复杂度的评价方法。

3.设有两个算法在同一台机器上运行,其执行时间分别为100n2和2n,要使前者快于后者,n至少为多大?

4.在顺序表中插入和删除一个结点需平均移动多少个结点,具体移动的次数取决于哪些因素?

5.简述定义:线性表、单链表、线性表的存储方式、循环链表、双向链表。

6.在单链表,双向链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将p从相应的链表中删去?若可以,其时间复杂度分别为多少?

7.有哪些链表可仅有一个尾指针来唯一确定,即从尾指针出发能访问到链表上任何一个结点?

8.何时选用顺序表,何时选用链表作为线性表的存储结构?

9.简述栈与队列的不同之处。

10.设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序压入其中,请回答下述问题: 若入、出栈次序为Push(1),Pop(),Push(2),Push(3), Pop(),Pop(),Push(4),Pop(),则出栈的数字序列如何?

能否得到出栈序列1423和1432,并说明为什么不能得到或者如何得到。

请分析1,2,3,4的各种排列中,哪些序列是可以通过相应的入,出栈操作得到的。 11.举例说明栈的“上溢”和“下溢”现象。

12.循环队列的优点是什么?如何判别它的空和满?

13.假定用一维数组a[7]顺序存储一个循环队列,队首和队尾指针分别用front和rear表示,当前队列中有5个元素:23,45,67,80,34,其中23为队首元素,front的值为3,请画出对应的存储状态,当连续进行4次出队运算后,再让15,36,48元素依次进队,请再次画出对应的存储状态。

14.空串和空格串有何区别?字符串中空格符有何意义?空串在串的处理中有何作用? 15.两个字符串相等的充要条件是什么?

16.二叉树和树之间有何区别?一棵度为2的树与二叉树有何区别?

17.在一棵二叉树如图1.11所示。写出对此树进行先序,中序,后序遍历时得到的结点序列。 18.已知一棵二叉树的中序遍历序列为CDBAEGF,先序遍历序列为ABCDEFG,试问能不能唯一确定一棵二叉树?若能,画出该二叉树。若给定先序遍历序列和后序遍历序列,能否唯一确定?

19.将图1.12所示的树转换成二叉树。

20.一棵度为2的有序树与一棵二叉树有何区别?

21.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 22.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?

23.试采用顺序存储方法和链式存储方法分别画出如图1.13所示各二叉树的存储结构。 24.假定用于通信的电文由8个字母组成,分别是A,B,C,D,E,F,G,和H,各字母在电文中出现的概率为:5%,25%,4%,7%,9%,12%,30%,8%,试为8个字母设计哈夫曼编码。

25.根据如图1.14所示的带权有向图G,试回答下面问题:

(1)给出从结点V1出发按深度优先搜索遍历G所得的结点序列,并给出按广度优先搜索遍历G所得的结点序列。

(2)给出从结点V1到结点V8的最短路径。

26.对于如图1.15所示的有向图,请给出

(1)对应的邻接矩阵,并给出A,B,C三个顶点的出度与入度。 (2)邻接表表示和逆邻接表表示。 (3)强连通分量。

27.假设图的顶点是A,B,C,D,?请根据下述邻接矩阵画出相应的有向图和无向图。 (1)0 1 1 1 (2) 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0

28.对n个顶点的无向图和有向图,采用邻接矩阵和邻接表表示时,如何判别下列有关问题: (1)图中有多少条边?

(2)任意两个顶点i和j是否有边相连?

(3)任意一个顶点的度是多少?

29.试述顺序查找法,折半查找法和分块查找法对查找表中元素的要求。

30.若有一个长度为n的表,其查找该表中每个元素的概率相同,采用顺序查找、折半查找和分块查找3种查找方法进行查找时的其平均查找长度各为多少?

31.设有一组关键字(17,13,14,153,29,35)需插入到表长为12的散列表中,请回答下列问题:

(1)设计一个适合该散列表的哈希函数。

(2)用设计的哈希函数将上述关键字插入到散列表中,画出其结构,并指出用线性探测再散列法解决冲突时构造散列表的装填因子为多少? 32.选择排序算法是否稳定?为什么?

33.给出一组关键字(19,01,26,92,87,11,43,87,21),进行冒泡排序,列出每一遍排序后关键字的排列次序,并统计每遍排序进行的关键字比较次数。 34.直接插入排序算法是否稳定?为什么? 35.堆排序为什么是不稳定的排序?试举例说明。

五、应用题

1.指出下列每个算法的功能并求出其时间复杂性。 (1)int sum1(int n) { int p=1,s=0;

for(int i=1;i<=n;i++) { p*=i; s+=p; }

return s;

}

(2) void mtable(int n) {for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) printf(“i*j=%d ”,i*j); printf(“\\n”);

}

(3)void cmatrix(int a[M][N],int d) /*M和N为全局整型常量*/ {

for(int i=0;i

}

2. void AA(sqlist &L)/*L为一个顺序表*/ {initiate_sqlist(L);/*初始化顺序表L*/

end_insert(L,30);/*把三十个元素插入到表尾*/ begin_insert(L,50)/*把五十个元素插入到表头*/ int a[4]={5,8,12,15}; int i;

for(i=0;i<=4;i++)

end_insert(L,a[i]);/*依次把每个元素插入到表尾*/ for(i=0;i<=4;i++)

begin_insert(L,a[i]);/*依次把每个元素插入到表头*/ }

该算法被调用执行后,得到的顺序表L为:__。 3. viod AC(lklist &HL)/*HL为一个单链表*/ {initiate_lklist(HL);/*初始化单链表HL*/

insert_lklist(HL,30,1);/*向单链表第一个位置插入元素30*/ insert_lklist(HL,50,2);/*向单链表第二个位置插入元素50*/ int a[5]={15,8,9,26,12};

for(inti=0;i<5;i++)begin_insert(HL,a[i]);

/*向HL的表头依次插入数组a中的前五个元素值*/ int x=delete_lklist(HL,3); /*此函数删除HL中的第三个结点并返回该结点的值*/ end_lklist(HL,x);/*向HL的表尾插入x*/

}

该算法被调用执行后,得到的HL单链表所对应的线性表为:____。 4.分别编写在顺序表和带头结点的单链表上统计出值为x的元素个数的算法,统计结果由函数值返回。

5.分别编写在顺序表和带头结点的单链表上删除其值等于x的所有元素。

6.分别编写在顺序表和单链表上删除具有重复值的多余结点,使每个结点的值均不同。如将线性表(2,8,9,2,5,5,6,8,7,2)变为(2,8,9,5,7)。

7.有6个元素A,B,C,D,E,F依次入栈,允许任何时候出栈,能否得到下列的各个出栈序列,若能,给出出栈操作的过程,若不能,简述其理由。 (1)CDBEFA(2)ABEDFC(3)DCEABF(4)BAEFCD

8.设计一个递归算法,计算出返回1至n之间的所有整数平方和。

9.斐波那契(Fibonacci)数列的定义为:它的第一项和第二项均为1,以后各项为前两项之和。若斐波那契数列中第n项用Fib(n)表示,则计算公式为:

试编写出计算Fib(n)的递归算法和非递归算法。

10.假定在一个链式队列中只设置队尾指针,不设置队首指针,并且让队尾结点的指针域指向队首结点(称此为循环队列),试分别写出在循环队列上进行插入和删除操作的算法。 11.设以二叉链表为二叉树的存储结构,结点的结构如下:

其中data为整数,试设计一个算法void change(bitreptrr),若结点左孩子data的值大于右孩子的data域的值,则交换其左右子树。

12.设计一个算法,统计出二叉树中等于给定值x的结点个数,该统计值由变量k带回(k的初值为0)。 Void countl(bitreptrr,datatype x,int &k)

13.设计一个算法,从一棵二叉树查找出所有结点的最大值并返回。

Datatype maximum(bitreptrr)

14.假设用于通信的电文有8个字母组成,字母在电文中出现的频率分别为:7,19,2,6,32,3,21,10。试为这8个字母设计哈夫曼编码。

15.已知一个无向图的邻接矩阵如图1.16所示,试写出从顶点V0出发分别进行深度优先和

广度优先搜索遍历得到的顶点序列。

深度优先搜索序列:__。 广度优先搜索序列:__。

16.已知一个无向图的邻接表如图1.17所示,试写出从顶点V0出发分别进行深度优先和广度优先搜索遍历得到的顶点序列。 深度优先搜索序列:__。 广度优先搜索序列:__。

17.已知一个带权有向图如1.18所示,用迪杰斯特拉提出的算法求其任一对结点之间的最短路径。

18.构造如图1.19所示加权图的最小生成树(给出利用克鲁斯卡尔算法构造的过程)。 19.对长度为11有序集,进行折半查找,试画出它的一棵判定树,并求在等概率情况下的平均查找长度。

20.已知一个顺序存储的有序表为(15,26,34,39,45,56,58,63,74,6),试画出对应的二分查找判定树,求出其平均查找长度。

21.假定一个线性表为(38,52,25,74,68,16,30,54,90,72)画出按线性表中元素的次序生成的一棵二叉排序树,求出其平均查找长度。

22.假定一个待散列存储的线性表为(32,75,29,63,48,94,25,36,18,70,49,80),散列地址空间为HT[11],若采用除留余数法构造散列函数和链接法处理冲突,试画出最后得到的链式哈希函数列表,并求出平均查找长度。

23.已知一组记录为(46,74,53,14,26,38,86,65,27,34)。 (1)给出采用直接插入排序法进行排序时每一趟的排序结果。 (2)给出采用冒泡排序法进行排序时每一趟的排序结果。 (3)给出采用快速排序法进行排序时每一趟的排序结果。

(4)给出采用直接选择排序法进行排序时每一趟的排序结果。 (5)给出采用堆排序法进行排序时每一趟的排序结果。

24.编写一个对整型数组A[n+1]中的A[1]至A[n]元素进行选择排序的算法,使得首先从待排序区间中选择出一个最小值并同第一个元素交换,再从待排序区间中选择一个最大值并同最后一个元素进行交换,反复进行直到最后待排序区间中元素个数不超过1为止。 参考答案 一 选择题

1.D 2.C 3.A 4.B 5.A 6.C 7.C 8.D 9.B 10.B 11.A 12.C 13.B 14.A 15.C 16.D 17.B 18.B 19.C 20.B 21.D 22.C 23.B 24.A 25.A 26.A 27.B 28.A 29.C 30.B 31.C 32.D 33.C 34.D 35.A 36.B 37.B 38.D 39.B 40.A 41.C 42.D 43.A 44.D 45.B 46.B 47.D 48.B 49.C 50.C 51.C 52.B 53.A 54.C 55.C 56.D 57.C 58.A 59.A 60.C 61.D 62.B 63.C 64.A 65.B 66.D 67.A 68.A 69.D 70.D 71.C 72.B 73.B 74.A 75.C 76.D 77.C 78.D 79.B 80.C 81.A 82.A 83.B 84.D 85.A 86.C 87.B 88.D 89.B 90.C 91.B 92.C 93.D 94.A 95.D 96.B 97.C 98.B 99.D 100.B 101.C 102.A 103.C 104.D 105.B 106.C 107.C 108.B 109.D 110.A 111.C 112.B 113.D 114.B 115.A 116.D 117.A 118.A 119.B 120.D

二 填空题

1.线形;非线形 2.顺序;链式;索引;散列存储结构 3. n;n(n+1)/2;O(n) 5.顺序;链式 7链式;顺序 9.O(1);O(n) 13.p->next->next

4.线性

6.顺序表;链式表 8.O(n);O(1) 10.p->next

14.p->next 16.O(1);O(n) 18.前趋;后续

11.HL->next==NULL; HL->next==HL 12. 循环 15.p->next=head;head=p 17.相同

19.q 21. 先进后出;先进先出 23.栈顶指针;插入(写入) 25.-1;M-1 27.top->next 29.Pop(s);Pop(s);Push(s,d) 31.front=rear;(r+1)%M==front 33.0;N-1

20. p->prior

22.0;1

24. 栈顶元素; 栈顶指针 26.p->next=top;top=p 28.Push(s,3);Pop(s);Push(s,5) 30.队尾;队首

32.(front+1)%M;(r+1)%M 34.队尾指针;插入(写入)

35.p->next=NULL;r=f=p 36.p->next=r->next;r=r->next=p

37.(front=rear)&&(front!=NULL)或者(front=rear)&&(rear!=NULL)38.空栈;空;只含有一个结点 39.1432

40.3080

41.3642.i(i-1)/2+j-1 44.树型或层次 46.根;前趋(父);后续(子) 48.2;6 50.10;4;3 52.B;I和J 54.2i;2i+1;i/2 55.16 56.5;8 57.A;F;空 58.2;2;3

59.a[10];a[11];a[2]

60.a[2i+1];a[2i+2];a[(i-1)/2] 61.2n,n-1,n+1 62.2h-1;2h-1 63.16;31

64.ABCDEF;CBAEDF;CBEFDA 65.2;4;3 66.4;5 67.3 68.4;87 69.图状 70.2

43.52 45.n-1 47.7;1;4;1 49.3;4

51.2;1;1;6 53.6

71.n(n-1)/2;n(n-1) 72.4 73.2;4 74.n-1

75.邻接矩阵;邻接表 76.1 77.3 78.4 79.7 80.n;n 81.e;2e

82.出边;入边

83.acdeb;acedb(答案不唯一) 84.acfebd;acefbd(答案不唯一) 85.深度;广度 86.唯一 87.(n+1)/2 88.

89.20.5;41 90.1b(n+1) 91.6

92.1;3 93.6;19 94.11 95.

96.小于;大于

97.查找成功;左子树;右子树 98. 左子树;右子树 99.1 100.5 101.2 102.n/m 103.3;2

104.插入;选择 105.4

106.直接插入 107.n-1;1

108.(46,56,38,40,79,84) 109.4 110.冒泡 111.3

112.4

113.[40 38]46[56 79 80] 114.快速

115.O(n2); O(n)

116.2 117.快速

118.(40,46,56,79,84,38) 119.堆排序 120.简单排序

三 名词解释

数据是指反映客观事物的信息的集合,它是数据结构所要描述的东西。 2.数据元素是数据的一个个体,它是数据的基本单位。

数据对象是指在数据这个集体中人们感兴趣的一个子集,通常,数据对象中的元素具有某些相同的特性。

数据结构是指相互之间有关联的数据元素的集合。 逻辑结构是指数据之间的逻辑关系。

算发在计算机执行时在时间资源方面消耗的多少。 算发在计算机执行时在空间资源方面消耗的多少。

栈是被限定为仅能在表尾进行插入和删除运算的线性表。

列对是一种只允许在表的一端进行插入,而在另一端进行删除的受限的线性表。 压缩存储是指给多个值相同的元素只分配一个空间,对零元素不分配空间。

树型结构是一类很重要的非线性数据结构,在这类结构中,元素结点之间存在明显的分支和层次关系。

一个结点的子树的个数称为该结点的度。 树的所有结点中最大的度称为树的度。

树的深度是指树的所有结点中最大的层次,又称树的高度。

有序树是指如果一棵树所有结点的子结点的左右顺序不可颠倒的树。

遍历是指循某条线路,依次访问某数据结构中的全部结点,而且每个结点只被访问一次。 哈夫曼树是指以文本中出现的字符为叶子结点的最优二叉树,其中叶子结点的全值为该字符在文本中出现的几率。

邻接关系是指在无向图中若存在边(Vi,Vj),则称结点Vi邻接于Vj或结点Vj邻接于Vi;在有向图中若存在边(Vi,Vj),则称结点Vj邻接于结点Vi。 路径是连接两个结点的边的集合。

如果无向图中的任意两个结点都是通的,则称无向图是连通图。

在有向图中,任意一对结点Vi和Vj之间都存在路径,则称有向图为强连通图。 若一个有向图中每一对结点之间都存在一条边,则称无向图为完全无向图。 若一个有向图中每一对结点之间都存在两条不同的边,则称有向图为完全有向图。 主关键字是指能用来唯一标识该记录的数据项。

四 简答题

线性结构是指数据元素之间存在一对一的关系。 树型结构是指元素之间存在一对多的关系。

图或网状结构是指数据元素之间存在多对多的关系。

算法的复杂度分析可分为时间复杂度和空间复杂度。时间复杂度以基本操作重复执行的次数为算法的时间量度。空间复杂度指算发所存储空间的量度。

3.要使100n2快于2n时, 必须满足100n2(2n, 可以算出n的值为15时, 2n恰好大于100n2, 所

以至少应该是15.

4.插入一个结点要平均移动n/2结点;删除一个结点要平均移动(n-1)/2结点;具体的移动次数取决于n的大小和插入或删除的位置这两个因素。

5.线性表是指由n(n>=0)个数据元素{a0,a1.a2?.an-2,an-1}组成的有限序列。该序列要么为空或仅有一个元素,要么除了第一个元素没有前趋以及最后一个元素没有后续之外,其他元素都有且仅有一个前趋,也有且仅有一个后续。线性表可以表示为:{ai|I属于[0,n-1]} 单链表是指必须是有一个称为表头的指针向连接,N个结点形成一个链,且每个结点只有一个指针域的线性表。

线性表的存储方式是指线性表的存储方式分为线性存储和链式存储两种,其中顺序存储是指线性表的顺序存储,链式存储是指线性表中的每一个结点其物理位置可连续,也可不连续,但是各结点间通过指针相连。

循环链表是指把单链表的末尾结点种的指针域指向头结点,形成环型的链表。

双向链表是指必须具有一个头指针,每个结点有两个指针域,一个指向该结点的前趋,一个指向该结点的后继的线性表。

6.在单链表中不能删除,而在双链表和单循环莲表中可以删除p结点。双向链表的删除p结点的时间复杂度为O(1),单循链表删除p结点的时间复杂度为O(1)。 7.在循环链表中可以由尾指针表示。

8.因为在顺序表中插入或删除时,需要移动大量的数据,所以在需要提高查找效率,而较少插入或删除的情况下,可以采用顺序储存;链式存储结构便于插入和删除。但是不便于查找结点。所以对于需要经常修改线性表结点位置的情况下,采用链式存储为宜。

9.栈,队列都是一种线性结构,只是他们的运算规则不同。栈是遵循先进后出的运算规则,堆栈的操只能在栈的一端(栈顶)进行;队列则遵循先进先出的运算规则,队的操作只能在队列的队首删除,队尾插入。 10.(1)1234。

(2)能得到1432,不能得到1423。因为同时压入2,3,在弹出时根据堆栈的运算规则只能弹出3,2。

(3)在1,2,3,4的各种排列中,根据堆栈的运算规则(先进后出),可能出现的次序是1234,1324,1432,2143,2134,3214,4321。

11.例如,在空间限定的情况下火车站的一条铁轨上已经停满了火车以后,火车已无法再进站,这属于上溢;调度在车辆派空以后,到时间没有车派了,这属于下溢。

12.循环队列的储存,可以解决假溢出的问题。空的条件是队首追上队尾,既front;满的条件是队尾追上队首,既rear+1=front。

13.两次对应的储存状态分别为:

14.不含任何字符的串称为空串,其串长度为零;仅含有空格字符的串称作空格,其长度为串中空格符的个数。

空格符在字符串中可用来分隔一般的字符,便于阅读和识别,空格符会占用串长。 空串在处理过程中可用于作为任意字符串的子串。

15.两个字符串相等的充要条件是:两个串的长度相等,且对应位置的字符相等。 16.二叉树与树的区别:

(1)二叉树的结点至多有两个子树,数则不然;

(2)二叉树的一个结点的子树有左,右之分,而树则没有此要求。

度为2 的树有两个分支,没有左,右之分,一颗二叉树边也可有两个分支。但 左右之分。且左右不能交换。

17.先序遍历序列:ABDEFC

中序遍历序列:DEFBAC

后序遍历序列:FEDBCA

18.(1)由中序遍历序列和先序遍历序列,或中序遍历序列和后序遍历序列,可以唯一确定一颗二叉树。

由先序序列知,根结点最先被访问,就可确定根结点为A,而又由中序序列得知一棵树的根结点是其左,右子树的分隔点,从而可确定以A为根的左子树的结点为B,C,D,右子树的结点为E,F,G。重复进行就可得到二叉树。

(2)由先序遍历序列和后序遍历序列不能唯一确定一棵二叉树。因为两种遍历方法只能确定根结点,而分不清左右子树。 19.二叉树如图1.20所示.

20.度为2的有序树是指子树从左向右是有次序的,每个结点最多有两个分支,二叉树的最大度也是2,并且子树有左右之分。从表面上看好像没有什么不同,但是当只有一个子树时,度为2的有序树没有左右之分,而二叉树必须有左右之分,这就是度为2的有序树和二叉树的主要区别。

21.假设结点为A,B,C,3个结点的树的状态如图1.21所示. 3个结点的二叉树的状态如图1.22所示

.

22.最少应为2h-1+1个结点,最多为2 h -1个结点。 23.顺序存储如图1.23所示. 链式存储如图1.24所示.

24.答:假设8个字母所对应的权值为{5,25,4,7,9,12,30,8},并且n=8。

根据哈夫曼的构造方法。将8个结点构成哈夫曼树,按照左0右1的原则,可以得到字母的豪夫曼编码为:

A.1001 B.11 C.1000 D.0000 E.101 F.001 G.01 H.0001 25.(1)深度优先遍历:V1,V2,V3,V8,V5,V7,V4,V6 广度优先遍历:V1,V2,V4,V6,V3,V5,V7,V8 (2)最短路径为:(V1,V2,,V5,V7,V8)

26.(1)邻接矩阵为:A 0 0 0 1 0 0 A的入度为2,出度为1 B 1 0 1 0 0 0 B的入度为2,出度为2 C 0 0 0 1 1 1 C的入度为1,出度为3 D 0 0 0 0 0 0 E 1 1 0 1 0 0 F 0 1 0 0 1 0

(2)邻接表为如图1.25所示。 A D

B A C C D E F D E A B D F B

E

逆邻接表按边的方向反之即可。 (3)强连通分量如图1.26所示。 图 1.26

27.(1)的无向图如图1.27(a)所示;(2)的有向图如图1.27(b)所示。

(b) 图 1.27 28.(1)采用邻接矩阵表示时,无向图的总边数为所有数值之和除以2;有向图的总边数为各行数值之和。采用邻接表表示时,无向图的边数为内部顶点个数除以2;有向图的边数为内部顶点个数。

(2)对于无向图是以图中i行和j列的交叉点的值是否为1;对于有向图是以图中i行j列交叉点或i列j行交叉点的值是否为1来判断顶点i和j是否有边相连。

(3)无向图顶点的度为每一行的数值之和;有向图顶点度为该行和该列数值之和。 29.顺序查找:表中元素可以任意存放。

折半查找:表中元素必须以关键字的大小按递增或递减的次序存放。 分块查找:表中元素每块内的元素可以任意存放,但是块与块之间必须以关键字的大小按递增或递减的次序存放。

30.顺序查找:查找成功时的平均查找长度为:ASL=(n+1)/2 折半查找:查找成功时的平均查找长度为:ASL=lg(n+1)-1 分

块查找:查找成功时的平均查找长度的大小与其确定所在块所采用的查找方法有关。若用顺序查找法确定所在块,则平均查找长度为(n/s+s)/2+1;若用折半查找法确定所在的块,平均查找长度为lg(n/s+1)+s/2,其中s为每块含有的元素个数。

31.(1)由于散列表的长度为12,则可选不超过表长的最大素数11作为除留余数法的模,则可得其哈希函数为H(k)=k。

(2)若用线性探测再散列法解决冲突,则可构造出散列表如 13 14

35 17 29 153 0 1 2 3 4 5 6 7 8 9 10

11

此时,其装填因子为6/12=1/2,若用链式法解决冲突,则其散列表如图1.28所示。 32.此种排序算法是不稳定的。

由于选择排序算法的原则是从记录中找到最小(或最大)者并与第一个记录交换,一旦被换到某个位置以后再也不动了,此种方法不能保证具有相同排序码的记录原来所具有的相对次序,即原来排在前面的经排序后有可能排在具有相同排序码记录的后面,所以此种排序算法是不稳定的。

33.

初始关键字序列为:

(19,01,26,92,87,11,43,87,21) 第一遍排序比较8次,交换6次后成为: (01,19,26,87,11,43,87,21,92) 第二遍排序比较7次,交换3次后成为: (01,19,26,11,43,87,21,87,92) 第三遍排序比较6次,交换2次后成为: (01,19,11,26,43,21,87,87,92) 第四遍排序比较5次,交换2次后成为: (01,11,19,26,21,43,87,87,92) 第五遍排序比较4次,交换1次后成为: (01,11,19,21,26,43,87,87,92) 第六遍排序比较3次,交换0次。排序完毕。 图1.28

34.直接插入排序算法是稳定的。

它不会将具有相同关键字的记录插入到其记录的前面,所以直接插入排序算法是稳定的。

35.因为在堆排序时,在调整堆的过程中,有可能改变具有相同关键字的元素的先后次序,

故该排序方法是不稳定的。例如,初始序列为8,5,5,按从小到大进行排序,则初始状态为:

调整为堆 输出5 调整为堆 输出5 显然,两个5的相对顺序发生了变化,所以是不稳定的。

五、应用题 1.(1)计算 的值。时间复杂性为O(n)。

(2)打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与j(i≤j≤n)的乘积。时间复杂性为O(n2)。 (3)使数组a[M,N]中的每一个元素均乘以d的值。时间复杂性为O(M*N)。 2.顺序表L为:(15,12,8,5,50,30,5,8,12,15) 3.HL单链表所对应的线性表为:(12,26,8,15,30,50,9) 4.算法如下:

/* 从顺序表上统计出值为x的元素个数的算法*/

int Count(sqlist &L,datatype x)? { int i=0,j; for (j=0;j

}

/*从单链表上统计出值为x的元素个数的算法*/ int Count(lklist &HL,datatype x) {node p=HL.Head—>next; int i=0;

while(p!=NULL) {if(p—>data==x)i++; p=p—>next; }

return; }

5.算法如下:

/*从顺序表中删除具有给定值x的所有元素*/ void Deletel(sqlist &L.datatype x) {int i,j=0;

while(i

{if (L.data[i]==x) /*删除下标为i的元素*/ {for(j=i+1;j

} }

/*从单链表中删除具有给定值的x的所有元素*/

void Deletel(lklist &HL,datatype x) {node *p=HL.head; node *q;

while(p—>next!=NULL) {q=p—>next;

if (q—>data==x)/*删除p的后继结点,即q结点*/ {p—>next=q—>next; delete q; }

else

p=p—>next; }

} 6 算法如下:

/ *从顺序表中删除所有其值重复的多余元素,使所有元素的均值不同*/ void Delete2(sqlist &L)

{int i = 0;

/* 每循环一次将删除data[i]后面与此值相同的所有元素*/ while (i

while(j

{if(L.data[j]= =L.data[i])/*从顺序表中删除data[j]元素*/ {int k;

for(k=j+1;k,L.last;k++) L.data[k-1]=L.data[k]; L.last――; } else j++; } i++; }

}

/*从单链表中删除所有其值重复的多余结点,使所有结点的均值不同*/ void Delete2(lklist &HL)

{node *p=HL.head; /* p指向第一个结点*/ while (p!=NULL)

{/*用t2指向待处理的结点,t2指向t2的前趋结点*/ node *t1=p,*t2=p->next;

/*此循环将从p后面的单链表中删除所有与p结点值相同的结点*/ while(t2!=NULL)

{if(t2->data= = p->data) /*删除t2结点*/ {t1->next=t2->next; delete t2;

t2=t1->next; /*t2指向新的结点*/

}

else /*指针后移,以便处理下一个结点*/ {t1=t2;t2=t2->next; }

}

p=p->next; /*p指向下一个结点*/

} }

7.第(1)列可以得到,操作过程为:Push(S,A),Push(S,B),Push(S,C),Pop(S),Push(S,D),Pop(S),Pop(S),Push(S,E),Pop(S),Push(S,F),Pop(S),Pop(S)。

第(2)个序列可以得到,操作过程为:Push(S,A),Pop(S),Push(S,B),Pop(S),Push(S,C),Push(S,D),Push(S,E),Pop(S),Pop(S),Push(S,F),Pop(S),Pop(S)。

第(3)个序列不可以得到,因为按照栈的后进先出或者称先进后出的原则,当A,B,C,D相继入栈,再进行两次出栈时,A&B仍在栈中,此后只能B在A前面出栈,而在此序列中出现了A先于B出栈的情况,所以说此序列是错误的。

第(4)个序列不可以得到,因为在某一时刻,C和D同在栈中,并且D是栈顶,此后只能D先于C出栈,而在此序列中出现了C先于D出栈的情况,所以是错误的。 8.int SquareSum(int n) { if(n==0)return 0; else return n*n+Square(n-1); }

9.递归算法如下:

int Fib(int n)

{if (n==1||n==2)return 1; /*终止递归条件*/ else return Fib(n-1)+Fib(n-2));} 非递归算法如下: int Fib1(int n)

{int a,b,c;/*c代表当前项,a和b分别代表当前项前面的第二项和第一项*/ a=b=1;

if(n==1||n==2) return 1; else

for(int i=3;i<=n;i++)

{c=a+b; /*求出当前项*/

a=b; /*把前面第一项赋给前面第二项*/ b=c; /*把当前项赋给前面第一项*/ }

return c; /*返回所求的第n项*/

}

10.插入操作的算法如下:

void EnQueue(node *&rear,datatype &x)/*使新元素x的值插入到循环链队中*/ {node *newptr=new node;/*得到一个由newptr指针所指向的新结点*/

if(newptr==NULL)

{printf(”Memory allocation failare!”); exit(1);

}

newptr—>data=x;/*把x的值赋给新结点的值域*/

if(rear==NULL)

rear=newptr—>next=newptr;/*若链队为空,则新结点既是队首结点又是队尾结点*/ else

{newptr—>next=rear—>next;/*使新结点的指针域指向队首结点*/ rear—>next=newptr; /*使队尾结点的指针域指向新结点*/ rear=newptr; /*使新结点成为新的队尾结点*/ } }

}

删除操作的算法如下:

datatype OutQueue(node *&rear) /*从循环链队中删除队首元素*/ {if(rear==NULL)

{printf(”Linked queue is empty!”); exit(1);

}

node *p=rear—>next; /*使P指向队首结点*/

if(p==rear) rear=NULL;/*若链队中只有一个结点,则删除后队尾指针为空*/ else rear—>next=p—>data; /*使队尾结点的指针域指向队首结点的后继指针*/ datatype temp=p—>data; /*暂存队首元素*/

delete p; /*回收原队首结点*/

return temp; /*返回被删除的队首元素*/

}

11./*当二叉树r中每个结点的左孩子的值大于右孩子的值时交换左右子树*/ void change(bitreptr r) { if (r!=NULL)

{ if(r—>lchild!=NULL&& r—>rchild!=NULL) if(r—>lchild—>data>r—>rchild—>data) {bitreptr t=r—>lchild; r—>lchild=r—>rchild; r—>rchild=t; }

change(r—>lchild); change(r—>rchild);

} }

12./*统计出二叉树中等于给定值x的结点个数,该统计值由引用变量带回*/ void count1(bitreptr r,datatype x,int &k) {if (r!=NULL)

{if(r—>data==x) k++; count1(r—>lchild,x,k);

count1(r—>rchild,x,k);

} }

13./*从二叉树中查找出所有结点的最大值并返回*/ datatype maximum(bitreptr r) {static datatype max=0; if (r!=NULL)

{static datatype k1,k2; k1=maximum(r—>lchild); k2=maximum(r—>rchild); if (k1>max) max=k1; else if (k2>max) max=k2;

else if(r—>data>max)max=r—>data; }

return max;

}

14.依题意可以设这8个字母分别为A,B,C,D,E,F,G,H,则依据哈夫曼树的构造方法可得其对应的哈夫曼树为: A B C D E F G H 7 19 2 6 32 3

21 10

根据左0右1的原则可得各字母对应的哈夫曼编码为: A.1010 B.00 C.10000 D.1001 E.11 F.10001

G.01 H.1011

15.深度优先搜索序列:0,2,3,5,6,1,4

广度优先搜索序列:0,2,3,5,6,1,4 16.深度优先搜索序列:0,3,6,4,1,5,2 广度优先搜索序列:0,3,2,6,5,4,1 17. 始点 终点

最短路径 最短路径长度 V1

V2

(V1,V2) 4

V1 V3

(V1,V2,V3) 6 V2 V1

V3

(V2,V3,V1) (V2,V3) 5 2

V3 V1 V2

(V3,V1)

(V3,V1,V2)

3 7

18.最小生成树如图1.29所示。

19.生成的二叉排序树如图1.30所示。 2 1 2 6

图1.29

图1.30 平均查找长度:ASL=(1+2×2+3×4+4×4)/11=3 20.折半查找判定树如图1.31所示。

平均查找长度:ASL=(1+2×2+3×4+4×3)/10=2.9 图1.31 21.解答:二叉排序树如图1.32所示。

平均查找长度: ASL=(1+2×2+3×3+4×2+5×2)/10=3.2 图1.32

22.得到的链式哈希列表如图1.33所示。

平均查找长度:ASL=(1×8+2×3+3×1)/12=17/12 0 1 2 3 80 36 25 4 70 48 5 49 6 94 7 18 29 8 63 9 75 10 32 23.(1) 初始状态 [46] 74 53 14 26 38 86 65 27

34

第一趟 [46 74] 53 14 26 38 86 65 27 34

第二趟 [46 53 74] 14 26 38 86 65 27 34

第三趟 [14 46 53 74] 26 38 86 65 27 34

第四趟 [14 26 46 53 74] 38 86 65 27

34

第五趟 [14 26 38 46 53 74] 86 65 27 34

第六趟 [14 26 38 46 53 74 86] 65 27 34

第七趟 [14 26 38 46 53 65 74 86] 27 34

第八趟 [14 26 27 38 46 53 65 74 86]

34

第九趟 [14 26 27 34 38 46 53 65 74 86]

(2) 初始状态 [46 74 53 14 26 38 86 65 27 34] 第一趟 [46 53 14 26 38 74 65 27 34] 86

第二趟 [46 14 26 38 53 65 27

34] 74 86

第三趟 [14 26 38 46 53 27 34] 65 74 86

第四趟 [14 26 38 46 27 34] 53 65 74 86

第五趟 [14 26 38 27 34] 46 53 65 74 86

第六趟 [14 26 27 34] 38 46 53

65 74 86

第七趟 [14 26 27 34] 38 46 53 65 74 86

(3) 初始状态 [46 74 53 14 26 38 86 65 27 34] 第一趟 [34 27 38 14 26] 46 [86 65 53 74] 第二趟 [26 27 14] 34 38

46 [74 65 53] 86

第三趟 14 26 27 34 38 46 [53 65] 74 86

第四趟 14 26 27 34 38 46 53 65 74 86

(4) 初始状态 [46 74 53 14 26 38 86 65 27 34] 第一趟 14 [74 53

46 26 38 86 65 27 34] 第二趟 14 26 [53 46 74 38 86 65 27 34] 第三趟 14 26 27 [46 74 38 86 65 53 34] 第四趟 14 26 27 34 [74 38 86 65 53 46] 第五趟 14 26 27

34 38 [74 86 65 53 46] 第六趟 14 26 27 34 38 46 [86 65 53 74] 第七趟 14 26 27 34 38 46 53 [65 86 74] 第八趟 14 26 27 34 38 46 53 65 [86 74] 第九趟 14 26 27

34 38 46 53 65 74 [86]

(5)构成初始堆(即建堆)的过程。 1 2 3 4 5 6 7 8 9 10 46 74 53 14 26 38 86 65 27 34 46 74 53 14 26 38 86 65 27 34 46 74 53 14 26

38 86 65 27 34 46 74 38 14 26 53 86 65 27 34 46 14 38 27 26 53 86 65 74 34 14 26 38 27 34 53 86 65 74

46

进行对排序的过程: 初始状态 14 26 38 27 34 53

86 65 74 46

第一趟 26 27 38 46 34 53 86 65 74 [14] 第二趟 27 34 38 46 74 53 86 65 [26 14] 第三趟 34 46 38 65 74 53 86 [27 26 14] 第四趟 38 46 53 65 74 86

[34 27 26 14] 第五趟 46 65 53 86 74 [38 34 27 26 14] 第六趟 53 65 74 86 [46 38 34 27 26 14] 第七趟 65 86 74 [53 46 38 34 27 26 14] 第八趟 74 86 [65 53 46 38

34 27 26 14] 第九趟 86 [74 65 53 46 38 34 27 26

14]

24./*采用另一种直接选择排序的方法对数组A中的n元素排序*/ void SelectSort(int A[],int n) {int x;

int i,j,k; /*共需要进行n/2趟*/

for(i=1;i<=n/2;i++) /*用k保存当前区间内最小值元素的下标,初值为i*/ {k=i; /*从当前排序区间中顺序查找出具有最小值的元素A[k]*/ for(j=i+1;j<=n-i+1;j++)

if(A[j]

{x=A[i];A[i]=A[k];A[k]=x;

} /*用k保存当前区间内最大值元素的下标,初值为n-i+1*/

k=n-i+1; /*从当前排序区间中顺序查找出具有最大值的元素A[k]*/ for(j=n-i;j)=i+1;j--)

if (A[j]>A[k]) k=j; /*把A[k]对调到该排序区间的最后一个位置*/ if(k!=n-i+1)

{x=A[n-i+1];A[n-i+1]=A[k];A[k]=x; } }

}