您的当前位置:首页正文

浙大远程数据结构与算法离线答案-最完整版

2020-08-22 来源:步旅网
浙江大学远程教育学院 《数据结构与算法》课程离线作业

一、填空题:(【序号,章,节】。。。。。。)

【1,1,2】线性结构中元素之间存在一对一关系,树形结构中元素之间存在 一对多 关系,图形结构中元素之间存在 多对多 关系。

【2,1,2】为了最快地存取数据元素,物理结构宜采用 序存储 结构。 3,1,2】数据结构的三要素是 逻辑结构, 物理结构 , 操作 。 【3,1,2】存储结构可根据数据元素在机器中的位置是否一定连续分为顺序存储结构,链式存储结构。

【4,1,3】度量算法效率可通过 时间复杂度和空间复杂度__来进行。

【5,1,3】设n 为正整数,下面程序段中前置以记号@的语句的频度是 n(n+1)/2 。

for (i=0; i@ a[i][j]=0; }

【6,1,3】设n 为正整数,试确定下列各程序段中前置以记号@的语句的频度: (1) i=1; k=0;

while (i<=n-1){ i++;

@ k+=10 * i; // 语句的频度是_____ n-1_______________。 } (2) k=0;

for (i=1; i<=n; i++){ for (j=i; j<=n; j++)

1

@ k++; // 语句的频度是_____ n(n+1)/2________________。 }

【7,3,2】线性表(a1,a2,…,an)有两种存储结构: 顺序存储结构和链式存储结构,请就这两种存储结构完成下列填充: _顺序存储结构__ 存储密度较大;_顺序存储结构___存储利用率较高;_顺序存储结构___可以随机存取;_链式存储结构____不可以随机存取;__链式存储结构__插入和删除操作比较方便。

【8,3,2】从一个长度为n的顺序表中删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。

【9,3,2】带头结点的单链表Head为空的条件是____ Head->next==null _____

【10,3,2】在一个单链表中p所指结点(p所指不是最后结点)之后插入一个由指针s所指结点,应执行s->next=__ p->next ___;和p->next=___s _____的操作。

【11,3,2】在一个单链表中删除p所指结点时,应执行以下操作: q= p->next;

p->data= p->next->data;

p->next= p->next->next _ ; free(q);

【12,3,2】带头结点的单循环链表Head的判空条件是_ Head->next==null ____; 不带头结点的单循环链表的判空条件是__ Head==null___。

【13,3,2】已知L是带表头结点的非空单链表, 且P结点既然不首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 删除P结点的直接前驱结点的语句序列是_10 12 8 11 4 14______。 b. 删除结点P的语句序列是_____10 12 7 3 14___________。 c. 删除尾元结点的语句序列是______9 11 3 14___________。 (1) P = P->next; (2) P->next = P;

2

(3) P->next = P->next ->next; (4) P = P->next ->next;

(5) while (P != NULL) P = P->next;

(6) while (Q->next != NULL){P = Q; Q = Q->next}; (7) while (P->next != Q) P = P->next; (8) while (P->next->next != Q) P = P->next;

(9) while (P->next->next != NULL) P = P->next; (10) Q = P;

(11) Q = P->next; (12) P = L;

(13) L = L->next; (14) free (Q);

【14,3,3】对一个栈,给定输入的顺序是A、B、C,则全部不可能的输出序列有 C A B 。

【15,3,3】.在栈顶指针为HS的链栈中,判定栈空的条件是 head->next==null 。

【16,3,3】下列程序把十进制数转换为十六进制数,请填写合适的语句成分。

void conversion10_16() { InitStack(&s); scanf(“%d”,&N); while(N){

____ Push(s, N%16) _____ ___ ;

N = N/16; }

while(!StackEmpty(s)){ _______ Pop(s, e) ; if(e<=9)printf(“%d”,e); else printf(“%c”,e-10+’A’); }

} /* conversion */

【17,3,4】若用一个大小为6个元素的数组来实现循环队列,且当前rear=0和front=3。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是 2 和 4 。

【18,3,4】堆栈和队列都是线性表, 堆栈是___后进先出__的线性表, 而队列是________

3

先进先出___的线性表。

【19,3,4】若用一个大小为6个元素的数组来实现循环队列,且当前rear=0和front=3

。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是 2 和 4 。 【20,4,2】已知一棵树边的集合是{,,,,,,,,}。那么根结点是 e ,结点b的双亲是 d ,结点a的子孙有 bcdj ,树的深度是 4 ,树的度是 3 ,结点g在树的第 3 层。 【21,4,3】从概念上讲,树与二叉树是二种不同的数据结构,将树转化为二叉树的基本的目的是 树可采用二叉树的存储结构并利用二叉树的已有算法解决树的有关问题 【22,4,3】满三叉树的第i层的结点个数为 3i-1 ,深度为h时该树中共有 3h-1 结点。

【23,4,3】已知一棵完全二叉树有56个叶子结点,从上到下、从左到右对它的结点进行编号,根结点为1号。则该完全二叉树总共结点有___111_____个;有__7_____层;第91号结点的双亲结点是___45____号;第63号结点的左孩子结点是_________号。 【24,4,3】下列表示的图中,共有____5___个是树;有___3____个是二叉树;有___2____个是完全二叉树。

4

【25,4,4】n个结点的二叉排序树的最大深度是 n ,最小深度为 [log2ⁿ]+1 _ 【26,4,3】如果某二叉树的后序遍历序列是ABCDEFGHI,中序遍历序列是ACBIDFEHG,则其先序遍历序列的第一个字母是 I ,最后一个字母是 G 。

【27,4,3】下列二叉树的中序遍历序列是____ DBNGOAEC ____ ___;后序遍历序列是________ DNOGBECA ___。

5

【28,5,4】设HASH表的大小为 n (n=10), HASH函数为 h(x)=x % 7, 如果二次探测再散列方法Hi=(H(key)+di) mod 10 (di = 12,22,32,…,)解决冲突,在HASH表中依次插入关

键字{1,14,55,20,84,27}以后,关键字1、20和27所在地址的下标分别是 、 ______ 和 。插入上述6个元素的平均比较次数是 。 答案:1、7、5、2

【29,6,3】设无权图G的邻接矩阵为A,若(vi,vj)属于图G的边集合,则对应元素A[i][j]等于 1 ,22、设无向图G的邻接矩阵为A,若A[i][j]等于0,则A[j][i]等于 0 。

【30,6,3】若一个图用邻接矩阵表示,则删除从第i个顶点出发的所有边的方法是 矩阵第i行全部置为零 。

【31,6,2】设一个图

G={V,{A}},V={a,b,c,d,e,f},A={,,,,,,}。那么顶点e的入度是 2 ;出度是 1 ;通过顶点f的简单回路有 2 条;就连通性而言,该图是 强连通图 图;它的强连通分量有 1 个;其生成树可能的最大深度是 5 。

【32,7,1】排序过程一般需经过两个基本操作,它们是 比较 和 移动 。 【33,7,2】在对一组关键字是(54,38,96,45,15,72,60,23,83)的记录进行直接插入排序时,当把第七个记录(关键字是60)插入到有序表时,为寻找插入位置需比较 3 次

6

分别与54、72、96比较

【34,7,4】插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序、和基数排序方法中,不稳定的排序方法有选择排序、快速排序、堆排序、希尔排序

7

二、综合题(选自教材《数据结构》各章习题,采用word文件格式上传)

【1,1,3】试分析下面一段代码的时间复杂度:

if ( A > B ) {

for ( i=0; ifor ( j=N*N; j>i; j-- ) A += B; }

else {

for ( i=0; ii; j-- ) A += B; }

if中的时间复杂度为:O(n*n²)即O(n³) else中的时间复杂度为:O(n*n)即O(n²)

【2,1,3】测试例1.3中秦九韶算法与直接法的效率差别。令f(x)1i1xi/i,计算f(1.1)的值。利用clock()函数得到两种算法在同一机器上的运行时间。 答:从运行结果可以看出秦九昭算法效率上有很大优势;

#include #include #include clock_t start,stop; double duration;

#define MAXN 10 #define MAXK 1e7

double f1(int n ,double a[],double x); double f2(int n ,double a[],double x);

//秦九昭算法

double f1(int n ,double a[],double x){

8

100 }

//直接算法

double f2(int n ,double a[],double x){ }

int main(){

int i =0 ; double p = a[0]; for(i=n;i>0;i--)

p = a[i-1] + x * p;

return p;

int i =0 ; double p = a[0]; for(i=n;i>0;i--)

p += a[i]*pow(x,i);

return p;

int i ;

double a[MAXN] ; for(i=0;ia[i]=(double)i;

start = clock(); for(i=0;if2(MAXN-1,a,1.1);

stop = clock();

duration = ((double)(stop-start))/CLK_TCK/MAXK ; printf(\"直接算法:\");

printf(\"ticks = %f\\n\",(double)(stop-start));

9

}

printf(\"duration = %6.2e\\n\",duration); for(i=0;ia[i]=(double)i;

start = clock(); for(i=0;if1(MAXN-1,a,1.1);

stop = clock();

printf(\"秦九昭算法:\");

printf(\"ticks = %f\\n\",(double)(stop-start)); printf(\"duration = %6.2e\\n\",duration); return 0;

【3,1,3】 试分析最大子列和算法1.3的空间复杂度。

答:在1.4中存在4种解决最大子列的算法,具体空间复杂度如下:

1、 穷举法:算法并没有开辟另外的存储空间进行存储,利用的是累加所以空间复杂度

为O(2); 2、 部分穷举:同上

3、 分而治之:利用递归解决问题,故空间复杂度为O(N); 4、 在线处理:为O(2);

【4,1,3】试给出判断N是否为质数的O(N)的算法。 答案:

#include #include

10

int is_prime(int n) {

if(n!= 2 && n % 2 == 0)

return 1; }

void main() {

int num = 0 ,result =0 ; printf(\"Input the num:\"); result = is_prime(num); { } { }

{ }

return 0;

int i = 0;

for(i=3;i<=sqrt((double)n);i+=2) if(n % i == 0) return 0;

scanf(\"%d\", &num); if(result)

printf(\"%d is a prime\\n\", num); else

printf(\"%d is not a prime\\n\", num); }

Input the num: 5 5 is a prime.

【5,2,2】请编写程序,输入整数n和a,输出S=a+aa+aaa+…+aa…a(n个a)的结果。 答案:

11

#include\"stdio.h\" int main() {

int a,b,n,i,s=0; scanf(\"%d %d\ b=a;

for(i=1;i<=n;i++) { s+=a; a=a*10+b; }

printf(\"%d\\n\}

【6,2,3】请编写递归函数,输出123..n的全排列(n小于10),并观察n逐步增大时程序的运行时间。 答案:

#include #include

void pailie(int* data, int n, int curr) {

int i = 0 ; {

if (curr==n-1)

for (i = 0; i < n; ++i ) printf(\"%d\", data[i]); printf(\"\\n\"); } else {

12

for (i = curr; i < n; ++i) {

int t;

t = data[curr], data[curr] = data[i], data[i] = t; pailie(data, n, curr+1);

t = data[curr], data[curr] = data[i], data[i] = t; } } }

int main() {

int n = 0;

int i = 0;

int as[10] = {0,0,0,0,0,0,0,0,0,0};//n小于等于10 scanf(\"%d\", &n);

return 0; }

end = clock();

printf(\"The time was: %d\\n\", (end - start) / CLK_TCK); { }

as[i] = i+1;

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

clock_t end;

clock_t start = clock();

pailie(as, n, 0);

13

N为7

14

N为9

分析来看时间上虽然有比较大的增长,但主要用于打印;但在时间复杂度上是随着n的变大呈直线上升趋势;

【7,3,2】 给定一个顺序存储的线性表L = (a1, a2, , an),请设计一个算法

15

删除所有值大于min而且小于max的元素。

SeqList Delete(SeqList &L, int min, int max) {

int i;=0,j=0

for (i=0; iif(L.elem[i]>min && L.elem[i]{ }

for(j=i;jL.elem[j]=L.elem[j+1]; --L.length;

}

return L ; }

【8,3,2】给定一个顺序存储的线性表L = (a1, a2, , an),请设计一个算法查找该线性表中最长递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

void main() {

int n, i, j, k;

int A[1024]={}; int dp[1024]={};

scanf(\"%d\", &n); for (i=1; i<=n; i++) scanf(\"%d\", A[i]); dp[1] = 1; // 有n个阶段

for (i=2; i<=n; i++) {

dp[i] = 1; // 每个阶段只有1个状态

16

// 每个状态有i种决策,以得出以元素i结尾的最长递归子序列的长度 for (j=i-1; j>=0; j--) {

if (A[i]>A[j])

{ }

dp[i] = max(dp[i], dp[j]+1); } }

int maximum = dp[1]; for (i=2; i<=n; i++) }

{ }

printf(\"%d maximum is : \\n\", maximum); maximum = max(maximum, dp[i]);

【9,3,3】 如果有1、2、3、4、5按顺序入栈,不同的堆栈操作(pop, push)顺序可得到不同的堆栈输出序列。请问共有多少种不同的输出序列?为什么?

答案:按照正常情况,1,2,3,4,5的全排列组合共有5! = 120,即120种,但由于 像:12435、12534之类的无法按顺序出入栈,故按照顺序入栈的情况共有56种: 以1开始排列组合为14种

17

以2开始排列组合为14种 以3开始的排列组合为9种 以4开始的排列组合为4种 以5开始的排列组合为1种

【10,3,2】请编写程序将中缀表达式转换为后缀表达式。 答案:使用栈的循序存储结构实现、栈的顺序存储结构,用一维数组实现

#include #include

#define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE 0

18

#define MAXSIZE 10 typedef int Status; typedef char ElemType; typedef struct {

ElemType data[MAXSIZE]; int top;//栈顶指针 }Stack; //1. 初始化

Status InitStack(Stack *S){ int i;

for(i=0;idata[i]=NULL; S->top=-1; return OK; }

//2. 创建一个长度为n的堆栈

Status CreateStack(Stack *S,int n){ int i =0;

if(n>MAXSIZE || n<1){

printf(\"输入长度有误!\\n\"); return ERROR; }

for(i=0;iS->data[i]=rand()%100+1; }

S->top=n-1;

return OK; }

Status push(Stack *S,ElemType e){ if(MAXSIZE-1==S->top){ printf(\"栈已满\\n\"); return ERROR; }

//栈顶指向的元素有值 ++(S->top);

19

S->data[S->top]=e; return OK; } //4. 出栈

Status pop(Stack *S,ElemType *e){ //将栈顶元素出栈,传给e if(-1==S->top){

printf(\"栈为空!\\n\"); return ERROR; }

*e=S->data[S->top]; --(S->top); return OK; }

//5. 中缀表达式转后缀表达式

void MidToFinal(char *mid,char *final){

//中缀表达式为middle,要转换成后缀表达式传给last //新建一个栈,来存储符号 char e; Stack S;

if(OK!=InitStack(&S)){

printf(\"初始化栈失败!\\n\"); }

//当带转换的字符串*mid未终止时,循环处理 while(*mid){

//如果是数字,则直接输出 if(*mid>='0' && *mid<='9'){ *(final++)=*(mid++); continue;

}else if(*mid=='+' || *mid=='-' || *mid=='*' || *mid=='/' || *mid=='(' || *mid==')'){

//输入的是合法运算符号,比较之前是否有更高优先级的符号 if(S.top==-1 || '('==*mid){

//当符号栈为空或遇到左括号时,符号入栈 push(&S,*(mid++)); continue; }

20

if(')'==*mid){

//遇到右括号时,栈顶元素依次出栈;直到遇到第一个左括号时结束 pop(&S,&e); *(final++)=e;

while(pop(&S,&e) && e!='('){ *(final++)=e; }

// printf(\"%c\\n\ mid++;

continue; }

//后续的处理都要取出临时的栈顶元素,与当前输入的符号*mid相比较;当临时栈顶元素优先级大于等于输入符号的优先级时,出栈;否则符号入栈(已经弹出一个,记得把弹出的元素也入栈) pop(&S,&e);

if('+'==*mid || '-'==*mid){ if(e=='('){ push(&S,'('); push(&S,*(mid++)); continue; }else{

*(final++)=e; push(&S,*(mid++)); continue; }

}else if('*'==*mid || '/'==*mid){ if('*'==e || '/'==e){ *(final++)=e; push(&S,*(mid++)); continue; }else{

push(&S,e); push(&S,*(mid++)); continue; } }

}else{

printf(\"输入的字符不合法!%c\\n\",*mid); return;

21

} }

//当待转换的字符已经结束时,符号栈至少还有一个元素(中缀表达式的特点:数字结尾;后缀表达式以符号结尾);将栈中的元素依次出栈 while(S.top!=-1){ pop(&S,&e); *(final++)=e; }

//字符串的结束符! *final='\\0'; }

int main() {

char data[]=\"3+(5*6-7/1*7)*9\"; char final[]=\"\"; MidToFinal(data,final); printf(\"%s\\n\",final); return 0; }

【11,4,3】设二叉树的存储结构如下:

Lchild data Rchild 1 0 J 0 2 0 H 0 3 2 F 0 4 3 D 9 5 7 B 4 6 5 A 0 7 8 C 0 8 0 E 0 9 10 G 0 10 1 I 0 其中根结点的指针值为6,Lchild,Rchild分别为结点的左、右孩子指针域,data为数据域。

(1) 画出二叉树的逻辑结构。

(2) 写出该树的前序、中序和后序遍历的序列。 答:

22

前序遍历:ECBHFDJIGA 中序遍历:ABCEDFHGIJ 后序遍历:ECHFJIGDBA

【12,4,4】可以生成如下二叉排序树的关键字的初始排列有几种?请写出其中的任意5个。

23

解:30种。任写5个序列如下: (5,4,7,6,2,3,1); (5,7,4,6,2,3,1); (5,4,7,2,3,1,6); (5,7,6,4,2,3,1); (5,7,6,4,2,1,3)

【13,4,5】给定关键字序列(11、7、16、4、22、13、5),请回答: (1)画出依次插入到一棵空的二叉排序树后的最终二叉树(6分); (2)画出依次把给定序列关键字插入一棵空的平衡二叉树后的结果(4分); 答:(1)

24

25

2)

26

27

【14,4,6】 假设一个文本使用的字符集为{a,b,c,d,e,f,g}, 字符的哈夫曼编码依次为{0110,10,110,111,00,0111,010}。

(1)请根据哈夫曼编码画出此哈夫曼树,并在叶子结点中标注相应的字符; (2)若这些字符在文本中出现的频率分别为:{3,35,13,15,20,5,9},求该哈夫曼树的带权路径长度。 答:

28

【15,5,3】用公式5.6计算一下你的身份证号码的散列值是多少。 答:公式5.6如下h(key)=key mod 11;

身份证号码信息如下:362429198307050010,设身份证为数字类型,对11求余后为4

【16,5,4】设有一组关键字{29,01,13,15,56,20,87,27,69,9,10,74},散列函数为:H(key) = key % 17,采用平方探测方法解决冲突。试在0到18的散列地址空间中对该关键字序列构造散列表。 答: 散列地址 0 插入29 插入01 插入13 插入15 插入56 插入20 插入87 插入27 插入69

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 说明 29 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 d2=-1 01 13 15 56 20 87 27 69 29

插入9 插入10 插入74 74 9 无冲突 d1=1 无冲突 10

【17,5,4】将关键字序列(7,8,30,11,18,9,14)散列存储到散列列表中,散列表的存储空间是一个下标从0开始的一个一维数组。处理冲突采用线性探测法,散列函数为:H(key)=(key×3)mod TableSize,要求装入因子为0.7。 答:tableSize为7/0.7,即10,散列函数为h(key)=(key*3) mod 10;下面为散列表插入过程 散列地址 0 插入7 插入8 插入30 插入11 插入18 插入9 插入14

30

1 7 2 3 11 4 8 5 18 6 7 9 8 9 说明 无冲突 无冲突 无冲突 无冲突 d1=1 无冲突 无冲突 30 14

【18,6,3】已知一个无向图的顶点集为{V0,V1,…,V7},其邻接矩阵如下所示:

V0 0 1 0 1 1 0 0 0 V1 1 0 1 0 1 0 0 0 V2 0 1 0 0 0 1 0 0 V3 1 0 0 0 0 0 1 0 V4 1 1 0 0 0 0 1 0 V5 0 0 1 0 0 0 0 0 V6 0 0 0 1 1 0 0 1 V7 0 0 0 0 0 0 0 1

(1) 画出该图的图形;

(2) 给出从V0出发的深度优先遍历序和广度优先遍历序。 答:

深度优先:01254673 广度优先:01324657

31

【19,6,3】已知有向图如右图所示,请给出该图的 (1) 每个顶点的入度和出度; (2) 邻接矩阵; (3) 邻接表; (4) 逆邻接表;

(5) 各个强连通分量 答案: (1): 节点号 入度 出度 1 3 0 2 2 2 3 1 2 4 1 3 5 2 1 6 2 3 (2):

1 0 1 0 0 1 1 2 1 0 1 1 0 1 3 0 1 0 1 0 1 4 0 1 1 0 1 1 5 1 0 0 1 0 1 6 1 1 1 1 1 0 (3):

32

((4):

(5):

1:无强连通分量

33

【20,6,3】试利用Dijkstra算法求下图在从顶点A到其它顶点的最短距离及对应的路径,写出计算过程中各步状态。

答: 初始(第0步) 第一步(选C) 第二步(选F) 第三步(选E) 第四步(选G) 第五步(选D) 第六步(选B) 终点 D

P D P D P D 34

P D P D P D P B C D E F G

15 2 12 ∞ ∞ ∞ 0 0 0 15 2 12 10 6 ∞ A A A C C 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 15 A A A C C D 15 2 12 10 6 15 A A A C C D 【21,6,3】给出如下图所示的具有7个结点的网G。请:

(1) 画出该网的邻接矩阵;

(2) 采用Prim算法,从4号结点开始,给出该网的最小生成树(画出Prim算法

的执行过程及最小生成树的生成示意图)。

1

答: (1):

0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 2 1 0 0 0 1 0 1 3 0 1 0 0 0 1 1 4 0 0 1 0 0 1 1 5 0 0 0 1 1 0 1 6 1 1 1 1 1 1 0

35

1 6 2 3 7 4 0 5 6 2 5 3 3 2 5 1 4 4

【22,7,4】给定数组{48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17},请分别用简单选择排序、直接插入排序和冒泡排序分别进行排序,写出排序过程中每一步操作后的结果,分析各自比较和交换的次数,以及排序结果是否稳定。 答:

简单选择排序:不稳定

48 25 6 90 17 84 62 48 27 96 49 72 17 第3与第1元素互换位置,值分别为6、48 6 25 48 90 17 84 62 48 27 96 49 72 17 第5与第2元素互换位置,值分别为17、25 6 17 48 90 25 84 62 48 27 96 49 72 17 第13与第3元素互换位置,值分别为17、48 6 17 17 90 25 84 62 48 27 96 49 72 48 第5与第4元素互换位置,值分别为25、90 6 17 17 25 90 84 62 48 27 96 49 72 48 第9与第5元素互换位置,值分别为27、90 6 17 17 25 27 84 62 48 90 96 49 72 48 第8与第6元素互换位置,值分别为48、84 6 17 17 25 27 48 62 84 90 96 49 72 48

36

第13与第7元素互换位置,值分别为48、62 6 17 17 25 27 48 48 84 90 96 49 72 62 第11与第8元素互换位置,值分别为49、84 6 17 17 25 27 48 48 49 90 96 84 72 62 第13与第9元素互换位置,值分别为62、90 6 17 17 25 27 48 48 49 62 96 84 72 90 第12与第10元素互换位置,值分别为72、96 6 17 17 25 27 48 48 49 62 72 84 96 90 6 17 17 25 27 48 48 49 62 72 84 96 90 第13与第12元素互换位置,值分别为90、96 6 17 17 25 27 48 48 49 62 72 84 90 96 插入排序:是稳定的 过程如下:

48 25 6 90 17 84 62 48 27 96 49 72 17 25 48 6 90 17 84 62 48 27 96 49 72 17 6 25 48 90 17 84 62 48 27 96 49 72 17 6 25 48 90 17 84 62 48 27 96 49 72 17 6 17 25 48 90 84 62 48 27 96 49 72 17 6 17 25 48 84 90 62 48 27 96 49 72 17 6 17 25 48 62 84 90 48 27 96 49 72 17

37

6 17 25 48 48 62 84 90 27 96 49 72 17 6 17 25 27 48 48 62 84 90 96 49 72 17 6 17 25 27 48 48 62 84 90 96 49 72 17 6 17 25 27 48 48 49 62 84 90 96 72 17 6 17 25 27 48 48 49 62 72 84 90 96 17 6 17 17 25 27 48 48 49 62 72 84 90 96 6 17 17 25 27 48 48 49 62 72 84 90 96 冒泡排序:是稳定的;

48 25 6 90 17 84 62 48 27 96 49 72 17 第1与第2元素互换位置,值分别为48、25 25 48 6 90 17 84 62 48 27 96 49 72 17 第2与第3元素互换位置,值分别为48、6 25 6 48 90 17 84 62 48 27 96 49 72 17 第4与第5元素互换位置,值分别为90、17 25 6 48 17 90 84 62 48 27 96 49 72 17 第5与第6元素互换位置,值分别为90、84 25 6 48 17 84 90 62 48 27 96 49 72 17 第6与第7元素互换位置,值分别为90、62 25 6 48 17 84 62 90 48 27 96 49 72 17 第7与第8元素互换位置,值分别为90、48

38

25 6 48 17 84 62 48 90 27 96 49 72 17 第8与第9元素互换位置,值分别为90、27 25 6 48 17 84 62 48 27 90 96 49 72 17 第10与第11元素互换位置,值分别为96、49 25 6 48 17 84 62 48 27 90 49 96 72 17 第11与第12元素互换位置,值分别为96、72 25 6 48 17 84 62 48 27 90 49 72 96 17 第12与第13元素互换位置,值分别为96、17 25 6 48 17 84 62 48 27 90 49 72 17 96 第1与第2元素互换位置,值分别为25、6 6 25 48 17 84 62 48 27 90 49 72 17 96 第3与第4元素互换位置,值分别为48、17 6 25 17 48 84 62 48 27 90 49 72 17 96 第5与第6元素互换位置,值分别为84、62 6 25 17 48 62 84 48 27 90 49 72 17 96 第6与第7元素互换位置,值分别为84、48 6 25 17 48 62 48 84 27 90 49 72 17 96 第7与第8元素互换位置,值分别为84、27 6 25 17 48 62 48 27 84 90 49 72 17 96 第9与第10元素互换位置,值分别为90、49

39

6 25 17 48 62 48 27 84 49 90 72 17 96 第10与第11元素互换位置,值分别为90、72 6 25 17 48 62 48 27 84 49 72 90 17 96 第11与第12元素互换位置,值分别为90、17 6 25 17 48 62 48 27 84 49 72 17 90 96 第2与第3元素互换位置,值分别为25、17 6 17 25 48 62 48 27 84 49 72 17 90 96 第5与第6元素互换位置,值分别为62、48 6 17 25 48 48 62 27 84 49 72 17 90 96 第6与第7元素互换位置,值分别为62、27 6 17 25 48 48 27 62 84 49 72 17 90 96 第8与第9元素互换位置,值分别为84、49 6 17 25 48 48 27 62 49 84 72 17 90 96 第9与第10元素互换位置,值分别为84、72 6 17 25 48 48 27 62 49 72 84 17 90 96 第10与第11元素互换位置,值分别为84、17 6 17 25 48 48 27 62 49 72 17 84 90 96 第5与第6元素互换位置,值分别为48、27 6 17 25 48 27 48 62 49 72 17 84 90 96 第7与第8元素互换位置,值分别为62、49

40

6 17 25 48 27 48 49 62 72 17 84 90 96 第9与第10元素互换位置,值分别为72、17 6 17 25 48 27 48 49 62 17 72 84 90 96 第4与第5元素互换位置,值分别为48、27 6 17 25 27 48 48 49 62 17 72 84 90 96 第8与第9元素互换位置,值分别为62、17 6 17 25 27 48 48 49 17 62 72 84 90 96 第7与第8元素互换位置,值分别为49、17 6 17 25 27 48 48 17 49 62 72 84 90 96 第6与第7元素互换位置,值分别为48、17 6 17 25 27 48 17 48 49 62 72 84 90 96 第5与第6元素互换位置,值分别为48、17 6 17 25 27 17 48 48 49 62 72 84 90 96 第4与第5元素互换位置,值分别为27、17 6 17 25 17 27 48 48 49 62 72 84 90 96 第3与第4元素互换位置,值分别为25、17 6 17 17 25 27 48 48 49 62 72 84 90 96

【23,7,4】给定数组{48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17},请分别用堆排序、快速排序和归并排序分别进行排序,写出排序过程中每一步操作后的结果,分析各自比较和交换的次数,以及排序结果是否稳定。

41

答:

堆排序:排序过程如下,从过程中的倒数第二次交换位置来看,堆排序是不稳定的; 第9与第4互换位置,值分别为96 , 17 第5与第2互换位置,值分别为84 , 6 第11与第5互换位置,值分别为72 , 6 第4与第1互换位置,值分别为96 , 25 第10与第4互换位置,值分别为49 , 25 第1与第0互换位置,值分别为96 , 48 第3与第1互换位置,值分别为90 , 48 第0与第12互换位置,值分别为96 , 17

17 90 84 48 49 72 62 48 27 17 25 6 96 第1与第0互换位置,值分别为90 , 17 第4与第1互换位置,值分别为49 , 17 第10与第4互换位置,值分别为25 , 17 第0与第11互换位置,值分别为90 , 6

6 49 84 48 25 72 62 48 27 17 17 90 96 第2与第0互换位置,值分别为84 , 6 第5与第2互换位置,值分别为72 , 6 第0与第10互换位置,值分别为84 , 17

17 49 72 48 25 6 62 48 27 17 84 90 96

42

第2与第0互换位置,值分别为72 , 17 第6与第2互换位置,值分别为62 , 17 第0与第9互换位置,值分别为72 , 17

17 49 62 48 25 6 17 48 27 72 84 90 96 第2与第0互换位置,值分别为62 , 17 第0与第8互换位置,值分别为62 , 27

27 49 17 48 25 6 17 48 62 72 84 90 96 第1与第0互换位置,值分别为49 , 27 第3与第1互换位置,值分别为48 , 27 第7与第3互换位置,值分别为48 , 27 第0与第7互换位置,值分别为49 , 27

27 48 17 48 25 6 17 49 62 72 84 90 96 第1与第0互换位置,值分别为48 , 27 第3与第1互换位置,值分别为48 , 27 第0与第6互换位置,值分别为48 , 17

17 48 17 27 25 6 48 49 62 72 84 90 96 第1与第0互换位置,值分别为48 , 17 第3与第1互换位置,值分别为27 , 17 第0与第5互换位置,值分别为48 , 6

6 27 17 17 25 48 48 49 62 72 84 90 96

43

第1与第0互换位置,值分别为27 , 6 第4与第1互换位置,值分别为25 , 6 第0与第4互换位置,值分别为27 , 6

6 25 17 17 27 48 48 49 62 72 84 90 96 第1与第0互换位置,值分别为25 , 6 第3与第1互换位置,值分别为17 , 6 第0与第3互换位置,值分别为25 , 6

6 17 17 25 27 48 48 49 62 72 84 90 96 第1与第0互换位置,值分别为17 , 6 第0与第2互换位置,值分别为17 , 17

17 6 17 25 27 48 48 49 62 72 84 90 96 第0与第1互换位置,值分别为17 , 6

6 17 17 25 27 48 48 49 62 72 84 90 96

快速排序:排序过程如下,17互换位置可以看出,快速排序并不稳定; 48 25 6 90 17 84 62 48 27 96 49 72 17 17 25 6 90 17 84 62 48 27 96 49 72 90 17 25 6 27 17 84 62 48 84 96 49 72 90 17 25 6 27 17 48 62 48 84 96 49 72 90 6 17 25 27 17 48 62 48 84 96 49 72 90 6 17 17 25 27 48 62 48 84 96 49 72 90

44

6 17 17 25 27 48 49 48 84 96 84 72 90 6 17 17 25 27 48 49 48 62 96 84 72 90 6 17 17 25 27 48 48 49 62 96 84 72 90 6 17 17 25 27 48 48 49 62 90 84 72 96 6 17 17 25 27 48 48 49 62 72 84 90 96 6 17 17 25 27 48 48 49 62 72 84 90 96 归并排序:过程如下,从过程可以看出归并排序是稳定的 48 25 6 90 17 84 62 48 27 96 49 72 17 25 48 6 90 17 84 62 48 27 96 49 72 17 25 48 6 90 17 84 48 62 27 96 49 72 17 6 25 48 90 17 84 48 62 27 96 49 72 17 6 25 48 90 17 48 62 84 27 96 49 72 17 6 25 48 90 17 48 62 84 27 49 72 96 17 6 17 25 48 48 62 84 90 27 49 72 96 17 6 17 25 48 48 62 84 90 17 27 49 72 96 6 17 17 25 27 48 48 49 62 72 84 90 96 6 17 17 25 27 48 48 49 62 72 84 90 96

【24,7,4】给定数组{48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17},请用3种不同的增量序列分别进行希尔排序,写出排序过程中每一步操作后的结果,分析各自比较和交换的次数,以及排序结果是否稳定。

45

#include

void Show(int arr[], int n) {

int i;

for ( i=0; ivoid ShellSort(int arr[], int n,int gap) {

int i, j, k; int temp;

for (gap = n / 2; gap > 0; gap /= 2) //步长的选取 {

for (i = 0; i < gap; i++) //直接插入排序原理 {

for (j = i + gap; j < n; j += gap) //每次加上步长,即按列排序。 { if (arr[j] < arr[j - gap])

46

{

temp = arr[j]; k = j - gap;

while (k >= 0 && arr[k] > temp) //记录后移,查找插入位置 {

arr[k + gap] = arr[k]; k -= gap; }

arr[k + gap] = temp; //找到位置插入 }

Show(arr,n); }

} } }

void main() {

int arr[] ={48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17}; int arr1[]={48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17};

47

int arr2[]={48, 25, 6, 90, 17, 84, 62, 48, 27, 96, 49, 72, 17};

printf(\"--------------- 增量为3 start ---------------\\n\"); ShellSort(arr,13,3);

printf(\"--------------- printf(\"--------------- ShellSort(arr1,13,6);

printf(\"--------------- printf(\"--------------- ShellSort(arr2,13,9);

printf(\"--------------- }

增量为3 end ---------------\\n\"); 增量为6 start ---------------\\n\"); 增量为6 end ---------------\\n\"); 增量为9 start ---------------\\n\"); 增量为9 end ---------------\\n\"); 48

49

50

51

因篇幅问题不能全部显示,请点此查看更多更全内容