数据结构-拓扑排序

数据结构-拓扑排序
数据结构-拓扑排序

14信计2015-2016(一)

数据结构课程设计

设计题目拓扑排序

设计时间2016.1.11——2016.1.15

学生姓名冯佳君

学生学号20140401105

所在班级14信计1

指导教师刘风华

徐州工程学院数学与物理科学学院

一、需求分析

1.问题描述

本次课程设计题目是:用邻接表构造图然后进行拓扑排序,输出拓扑排序序列。

拓扑排序的基本思想为:

1)从有向图中选一个无前驱的顶点输出;

2)将此顶点和以它为起点的弧删除;

3) 重复1)、 2)直到不存在无前驱的顶点;

4) 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。

2.拓扑排序有向图拓朴排序算法的基本步骤如下:

1)从图中选择一个入度为0的顶点,输出该顶点;

2)从图中删除该顶点及其相关联的弧,调整被删弧的弧头结点的入度(入度-1);

3)重复执行1)、2)直到所有顶点均被输出,拓朴排序完成或者图中再也没有入度为0的顶点(此种情况说明原有向图含有环)。

3.基本要求

(1)输入的形式和输入值的范围;

首先是输入要排序的顶点数和弧数,都为整型,中间用分隔符隔开;再输入各顶点的值,为正型,中间用分隔符隔开;然后输入各条弧的两个顶点值,先输入弧头,再输入弧尾,中间用分隔符隔开,输入的值只能是开始输入的顶点值否则系统会提示输入的值的顶点值不正确,请重新输入,只要继续输入正确的值就行。

(2)输出的形式;

首先输出建立的邻接表,然后是最终各顶点的出度数,再是拓扑排序的序列,并且每输出一个顶点,就会输出一次各顶点的入度数。

(3) 程序所能达到的功能;

因为该程序是求拓扑排序,所以算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用顶点表示活动,有向边就表示活动间先后顺序,那么输出的拓扑序列就表示各顶点间的关系为反映出各点的存储结构,以邻接表存储并输出各顶点的入度。

二、概要设计

1. 算法中用到的所有各种数据类型的定义

在该程序中用邻接表作为图的存储结构。首先,定义表结点和头结点的结构类型,然后定义图的结构类型。创建图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。

拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。

2.各程序模块之间的层次调用关系

第一部分,void ALGraph *G函数构建图,用邻接表存储。这个函数没有调用函数。

第二部分,void TopologicalSort(ALGraph *G)输出拓扑排序函数,这个函数首先调用FindInDegree(G,indegree)对各顶点求入度indegree[0……vernum-1];然后设置了一个辅助栈,调用InitStack(&S)初始化栈,在调用Push(&S,i)入度为0者进栈,while(!StackEmpty(&S))栈不为空时,调用Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,入度indegree[k]--,当输出某一入度为0的顶点时,便将它从栈中删除。

第三部分,主函数,先后调用void CreatGraph(ALGraph *G)函数构建图、void TopologicalSort(ALGraph *G)函数输出拓扑排序实现整个程序。

3.设计的主程序流程(见附页)

流程图:

三、详细设计

(实现概要设计中定义的所有数据类型,对每个操作写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为;按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);写出出函数和过程的调用关系。)

1.实现概要设计中定义的所有数据类型

#include

#include

#define MAX_VEXTEX_NUM 100

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define OK 1

#define M 100

#define ERROR 0

typedef int ElemType;

typedef struct ArcNode

{

int adjvex;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode

{

int data;

ArcNode *firstarc;

}VNode,AdjList[MAX_VEXTEX_NUM];

typedef struct

{

AdjList vertices;

int vexnum, arcnum;

}ALGraph;

typedef struct

{

ElemType *base;

ElemType *top;

int stacksize;

}SqStack;

2.算法和各模块的代码

程序中各函数算法思想如下:

2.1 void InitStack(SqStack *S)

初始化栈将栈的空间设为 STACK-INIT-SIZE。

2.2 int Pop(SqStack *S,ElemType *e)

出栈操作,若站不空,删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。

2.3 void Push(SqStack *S,ElemType e)

进栈操作,插入元素e为新的栈顶元素。

2.4 int StackEmpty(SqStack *S)

判断栈是否为空,语句if (S->top=S->base )判断,若栈不为空,则删除S 的栈顶元素,并返回OK;否则返回ERROR。

2.5 void CreatGraph (ALGraph *G)

构建图,用邻接表存储,首先定义邻接表指针变量,输入顶点数和弧数,初始化邻接表,将表头向量域置空,输入存在弧的点集合,当输入顶点值超出输入值的范围就会出错,否则依次插入进邻接表,最后输出建立好的邻接表。

2.6 void FindInDegree(ALGrap G, int indegreee[])

求入度操作,设一个存放各顶点入度的数组indegreee[],然后

indegreee[i]=0赋初值,for循环indegreee[]++,存储入度数。

2.7 void TopologicalISort(ALGraph G)

输出拓扑排序函数。其思路是若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR。首先由于邻接表的存储结构入度为零的顶点即为没有前驱的顶点,我们可以附设一个存放个顶点入度的数组,调用FindInDegree( G, indegreee[])对各顶点求入度;为了避免重复检测入度为零0的顶点,设置一个栈,调用InitStack(&S)初始化栈,在调用Push(&S,i)入度为0者进栈,while(!StackEmpty(&S))栈不为空时,调用Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,入度indegree[k]--,当输出某一入度为0的顶点时,便将它从栈中删除。

3.算法的时间复杂度和空间复杂度

拓扑排序实际是对邻接表表示的图G进行遍历的过程,每次访问一个入度为零的顶点,若图G中没有回路,则需扫描邻接表中的所有边结点,在算法开始时,为建立入度数组D需访问表头向量中的所有边结点,算法的时间复杂度为

O(n+e)。

四、测试与分析

输入:

结果如下:

五、总结

拓扑排序就是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。

在进行课程设计中,更好的认识了拓扑排序。理清了各个模块之间算法之间的条理。认识了伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。介于自然语言与编程语言之间。它是一种让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多。

在设计中,我们遇到了程序正确,却对某些无向图无法进行拓扑排序的问题。多次对程序进行修改后,才可以进行拓扑排序。问题出在调用函数的错误理解,模块之间的联系模糊不清。

附录:源程序:

#include

#include

#define MAX_VEXTEX_NUM 100

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define OK 1

#define M 100

#define ERROR 0

typedef int ElemType;

typedef struct ArcNode

{

int adjvex;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode

{

int data;

ArcNode *firstarc;

}VNode,AdjList[MAX_VEXTEX_NUM];

typedef struct

{

AdjList vertices;

int vexnum, arcnum;

}ALGraph;

typedef struct

{

ElemType *base;

ElemType *top;

int stacksize;

}SqStack;

void InitStack(SqStack *);

int Pop(SqStack *, ElemType *);

void Push(SqStack *,ElemType );

int StackEmpty(SqStack *);

void CreatGraph(ALGraph *);

void FindInDegree(ALGraph , int * );

void TopologicalSort(ALGraph );

void InitStack(SqStack *S)

{

S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base)

{

printf("内存分配失败,请检查储存位置,再见");

exit(1);

}

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

}

int Pop(SqStack *S,ElemType *e)

{

if(S->top==S->base)

{

return ERROR;

}

*e=*--S->top;

return 0;

}

void Push(SqStack *S,ElemType e)

{

if(S->top-S->base>=S->stacksize)

{

S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!S->base)

{

printf("内存分配失败,请检查储存位置,再见");

exit(1);

}

S->top = S->base+S->stacksize;

S->stacksize+=STACKINCREMENT;

}

*S->top++=e;

}

int StackEmpty(SqStack *S)

{

if(S->top==S->base)

return OK;

else

return ERROR;

}

void CreatGraph(ALGraph *G)

{

int m, n, i;

ArcNode *p;

printf("请输入顶点数和边数:");

scanf("%d%d",&G->vexnum,&G->arcnum);

for (i = 1; i <= G->vexnum; i++)

{

G->vertices[i].data = i;

G->vertices[i].firstarc = NULL;

}

for (i = 1; i <= G->arcnum; i++)

{

printf("\n请输入存在边的两个顶点的序号,先输入弧尾,再输入弧头:"); scanf("%d%d",&n,&m);

while (n < 0 || n > G->vexnum || m < 0 || m > G->vexnum)

{

printf("输入的顶点序号不正确请重新输入:");

scanf("%d%d",&n,&m);

}

p = (ArcNode*)malloc(sizeof(ArcNode));

if (p == NULL)

{

printf("内存分配失败,请检查储存位置,再见");

exit(1);

}

p->adjvex = m;

p->nextarc = G->vertices[n].firstarc;

G->vertices[n].firstarc = p;

}

}

void FindInDegree(ALGraph G, int indegree[])

{

int i;

for (i = 1; i <= G.vexnum; i++)

{

indegree[i] = 0;

}

for (i = 1; i <= G.vexnum; i++)

{

while (G.vertices[i].firstarc)

{

indegree[G.vertices[i].firstarc->adjvex]++;

G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;

}

}

}

void TopologicalSort(ALGraph G)

{

int indegree[M];

int i, k, n,b,j=0;

int a[20];

int count = 0;

ArcNode *p;

SqStack S;

FindInDegree(G, indegree);

InitStack(&S);

for ( i = 1; i <= G.vexnum; i++)

{

if (!indegree[i])

Push(&S,i);

}

while(!StackEmpty(&S))

{

Pop(&S,&n);

a[j]=G.vertices[n].data;

j++;

count++;

for (p = G.vertices[n].firstarc; p != NULL; p = p->nextarc) {

k = p->adjvex;

if (!(--indegree[k]))

{

Push(&S,k);

}

}

}

printf("\n");

if (count < G.vexnum)

{

printf("该有向图有环\n");

}

else

{

printf("排序成功\n");

printf("进行拓扑排序输出顺序为:"); for (b=0;b

{

printf("%4d",a[b]);

}

printf("\n");

}

}

int main(void)

{

ALGraph G;

CreatGraph(&G);

TopologicalSort(G);

system("pause");

return 0;

}

C语言版数据结构 快速排序 -

4.快速排序 详细设计 #include #include #include #define Max_Size 5000 typedef int KeyType; typedef int OtherType; typedef struct { KeyType key; OtherType other_data; }RecordType; int QKPass(RecordType r[],int low, int high ) //对记录数组r[low..high]用快速排序算法进行排序*/ { r[0]=r[low]; //将枢轴记录移至数组的闲置分量 int pivotkey=r[low].key;//枢轴记录关键字 while(low=pivotkey) --high; // high从右到左找小于x.key的记录if(low

计算机专业基础综合数据结构(排序)-试卷2

计算机专业基础综合数据结构(排序)-试卷2 (总分:56.00,做题时间:90分钟) 一、单项选择题(总题数:16,分数:32.00) 1.单项选择题1-40小题。下列每题给出的四个选项中,只有一个选项是最符合题目要求的。(分数: 2.00)__________________________________________________________________________________________ 解析: 2.采用简单选择排序,比较次数与移动次数分别为( )。 (分数:2.00) A.O(n),O(log 2 n) B.O(log 2 n),O(n 2 ) C.O(n 2 ),O(n) √ D.O(nlog 2 n),O(n) 解析:解析:简单选择排序的关键字比较次数KCN与对象的初始排列无关。第i趟选择具有最小关键字对象所需的比较次数总是n—i—1次(此处假定整个待排序对象序列有n个对象)。因此,总的关键字比较次 最坏情况是每一趟都要进行交换,总的对象移动次数为RMN=3(n一1)。 3.就排序算法所用的辅助空间而言,堆排序、快速排序、归并排序的关系是( )。 (分数:2.00) A.堆排序<快速排序<归并排序√ B.堆排序<归并排序<快速排序 C.堆排序>归并排序>快速排序 D.堆排序>快速排序>归并排序 解析:解析:此题考查的知识点为排序的空间复杂性。堆排序辅助空间为O(1),快速排序为O(log 2 n),归并排序为O(n)。应选A。 4.一组记录的关键码为(25,48,16,35,79,82,23,40,36,72),其中,含有5个长度为2的有序表,按归并排序的方法对该序列进行一趟归并后的结果为( )。 (分数:2.00) A.16,25,35,48,23,40,79,82,36,72 √ B.16,25,35,48,79,82,23,36,40,72 C.16,25,48,35,79,82,23,36,40,72 D.16,25,35,48,79,23,36,40,72,82 解析:解析:对于(25,48,16,35,79,82,23,40,36,72),(25,48)和(16,35)归并的结果为(16,25,35,48)。(79,82)和(23,40)归并后的结果为(23,40,79,82),余下的两个记录不归并,所以一趟归并后的结果为(16,25,35,48,23,40,79,82,36,72),本题答案为A。 5.已知10个数据元素为(54,28,16,34,73,62,95,60,26,43),对该序列按从小到大排序,经过一趟冒泡排序后的序列为( )。 (分数:2.00) A.16,28,34,54,73,62,60,26,43,95 B.28,16,34,54,62,73,60,26,43,95 √ C.28,16,34,54,62,60,73,26,43,95 D.16,28,34,54,62,60,73,26,43,95 解析:解析:冒泡排序每趟经过比较、交换,从无序区中产生一个最大的元素,所以选B。 6.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下: (1)25,84,21,47,15,27,68,35,20 (2)20,15,21,25,47,27,68,35,84 (3)15,20,21,25,35,27,47,68,84 (4)15,20,21,25,27,35,47,68,84 其所采用的排序方法是( )。(分数:2.00) A.直接选择排序√

数据结构实验五-查找与排序的实现

实验报告 课程名称数据结构实验名称查找与排序的实现 系别专业班级指导教师11 学号姓名实验日期实验成绩 一、实验目的 (1)掌握交换排序算法(冒泡排序)的基本思想; (2)掌握交换排序算法(冒泡排序)的实现方法; (3)掌握折半查找算法的基本思想; (4)掌握折半查找算法的实现方法; 二、实验内容 1.对同一组数据分别进行冒泡排序,输出排序结果。要求: 1)设计三种输入数据序列:正序、反序、无序 2)修改程序: a)将序列采用手工输入的方式输入 b)增加记录比较次数、移动次数的变量并输出其值,分析三种序列状态的算法时间复杂 性 2.对给定的有序查找集合,通过折半查找与给定值k相等的元素。 3.在冒泡算法中若设置一个变量lastExchangeIndex来标记每趟排序时经过交换的最后位置, 算法如何改进? 三、设计与编码 1.本实验用到的理论知识 2.算法设计

3.编码 package sort_search;

import java.util.Scanner; public class Sort_Search { //冒泡排序算法 public void BubbleSort(int r[]){ int temp; int count=0,move=0; boolean flag=true; for(int i=1;ir[j+1]){ temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; move++; flag=true; } } } System.out.println("排序后的数组为:"); for(int i=0;ikey){

数据结构排序习题

07排序 【单选题】 1. 从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为(A)排序法。 A、直接插入 B、简单选择 C、希尔 D、二路归并 2. 直接插入排序在最好情况下的时间复杂度为(B)。 A、O(logn) B、O(n) C、O(n*logn) D、O(n2) 3. 设有一组关键字值(46,79,56,38,40,84),则用堆排序的方法建立的初始堆为(B)。 A、79,46,56,38,40,80 B、84,79,56,38,40,46 C、84,79,56,46,40,38 D、84,56,79,40,46,38 4. 设有一组关键字值(46,79,56,38,40,84),则用快速排序的方法,以第一个记录为基准得到的一次划分结果为(C)。 A、38,40,46,56,79,84 B、40,38,46,79,56,84 C、40,38,46,56,79,84 D、40,38,46,84,56,79 5. 将两个各有n个元素的有序表归并成一个有序表,最少进行(A)次比较。 A、n B、2n-1 C、2n D、n-1 6. 下列排序方法中,排序趟数与待排序列的初始状态有关的是(C)。 A、直接插入 B、简单选择 C、起泡 D、堆 7. 下列排序方法中,不稳定的是(D)。 A、直接插入 B、起泡 C、二路归并 D、堆 8. 若要在O(nlog2n)的时间复杂度上完成排序,且要求排序是稳定的,则可选择下列排序方法中的(C)。 A、快速 B、堆 C、二路归并 D、直接插入 9. 设有1000个无序的数据元素,希望用最快的速度挑选出关键字最大的前10个元素,最好选用(C)排序法。 A、起泡 B、快速 C、堆 D、基数 10. 若待排元素已按关键字值基本有序,则下列排序方法中效率最高的是(A)。 A、直接插入 B、简单选择 C、快速 D、二路归并 11. 数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的(C)的两趟排序后的结果。 A、选择排序 B、冒泡排序 C、插入排序 D、堆排序 12. (A)占用的额外空间的空间复杂性为O(1)。 A、堆排序算法 B、归并排序算法 C、快速排序算法 D、以上答案都不对

数据结构第十章习题课

1.下列排序算法中,其中()是稳定的。 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 2.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。 A. 快速排序 B. 堆排序 C. 归并排序 D. 直接插入排序3.排序趟数与序列的原始状态有关的排序方法是( )排序法。 A.插入 B. 选择 C. 冒泡 D. 快速4.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中 的变化为(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47 (4) 15 21 25 47 84 则采用的排序是( )。 A. 选择 B. 冒泡 C. 快速 D. 插入5.对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15};则采用的是()排序。 A. 选择 B. 快速 C. 希尔 D. 冒泡6.若上题的数据经一趟排序后的排列为{9,15,7,8,20,-1,4},则采用的 是()排序。 A.选择 B. 堆 C. 直接插入 D. 冒泡 7.在文件“局部有序”或文件长度较小的情况下,最佳内部排序的方法是()A.直接插入排序B.冒泡排序C.简单选择排序 8.下列排序算法中,()算法可能会出现下面情况:在最后一趟开始之前,所有元素都不在其最终的位置上。 A. 堆排序 B. 冒泡排序 C. 快速排序 D. 插入排序 9. 下列排序算法中,占用辅助空间最多的是:( ) A. 归并排序 B. 快速排序 C. 希尔排序 D. 堆排序10.用直接插入排序方法对下面四个序列进行排序(由小到大),元素比较次数 最少的是()。 A.94,32,40,90,80,46,21,69 B.32,40,21,46,69,94,90,80 C.21,32,46,40,80,69,90,94 D.90,69,80,46,21,32,94,40 11. 若用冒泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行()次比较。 A. 3 B. 10 C. 15 D. 25 12.对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确

C语言数据结构 快速排序 源码

Quick Sort 程序已就绪,可直接编译运行 #include #include #include #define OK 1 #define TRUE 1 #define ERROR 0 #define FALSE 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int Status; typedef intKeyType; //定义关键字类型为整数型typedef intInfoType; typedef struct { KeyType key; //关键字项

InfoType info; //其他记录项 }RedType; //记录类型 typedef struct { RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元 int length; //顺序表长度 }SqList; //顺序表类型 intPartition(SqList&L,intlow,int high) {//交换顺序表L中子表L.r[low..high]的记录,使枢轴记录到位,并返回其所在位置 //此时在它之前(后)的记录均不大(小)于它。 KeyTypepivotkey; L.r[0]=L.r[low]; //用子表的第一个记录作枢轴记录 pivotkey=L.r[low].key; //枢轴记录关键字 while(low=pivotkey)--high; L.r[low]=L.r[high]; //将比枢轴记录小的记录移到低端 while(low

数据结构各种排序方法的综合比较

数据结构各种排序方法的综合比较 结论: 排序方法平均时间最坏时间辅助存储 简单排序O(n2) O(n2) O(1) 快速排序O(nlogn)O(n2)O(logn) 堆排序O(nlogn)O(nlogn)O(1) 归并排序O(nlogn)O(nlogn)O(n) 基数排序O(d(n+rd))O(d(n+rd))O(rd) PS:直接插入排序、冒泡排序为简单排序,希尔排序、堆排序、快速排序为不稳定排序 一、时间性能 按平均的时间性能来分,有三类排序方法: 时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为 最好,特别是对那些对关键字近似有序的记录序列尤为如此; 时间复杂度为O(n)的排序方法只有,基数排序。 当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。 二、空间性能 指的是排序过程中所需的辅助空间大小。 1. 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2. 快速排序为O(logn),为栈所需的辅助空间; 3. 归并排序所需辅助空间最多,其空间复杂度为O(n ); 4.链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)。 三、排序方法的稳定性能 1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。 3. 对于不稳定的排序方法,只要能举出一个实例说明即可。 4. 快速排序和堆排序是不稳定的排序方法

数据结构第七章图练习及答案

1.拓扑排序的结果不是唯一的,试写出下图任意2个不同的拓扑序列。 2.写出求以下AOE网的关键路径的过程。要求:给出每一个事件和每一个活动的最早开始时间和最晚开始时间。 【解析】解题关键是弄清拓扑排序的步骤 (1)在AOV网中,选一个没有前驱的结点且输出;(2)删除该顶点和以它为尾的弧;(3)重复上述步骤直至全部顶点均输出或不再有无前驱的顶点。 【答案】(1)0132465 (2)0123465 【解析】求关键路径首先求关键活动,关键活动ai的求解过程如下 (1)求事件的最早发生时间ve(j), 最晚发生时间vl(j); (2)最早发生时间从ve(0)开始按拓扑排序向前递推到ve(6), 最晚发生时间从vl(6)按逆拓扑排序向后递推到vl(0); (3)计算e(i),l(i):设ai由弧表示,持续时间记为dut,则有下式成立 e(i)=ve(j) l(i)=vl(k)-dut() (4)找出e(i)-l(i)=0的活动既是关键活动。 【答案】

关键路径为:a0->a4->a6->a9 7.1选择题 1.对于一个具有n个顶点和e条边的有向图,在用邻接表表示图时,拓扑排序算法时间复杂度为(B) A)O(n) B)O(n+e) C)O(n*n) D)O(n*n*n) 2.设无向图的顶点个数为n,则该图最多有(B)条边。 A)n-1 B)n(n-1)/2 C)n(n+1)/2 D)n2 3.连通分量指的是(B) A)无向图中的极小连通子图 B)无向图中的极大连通子图 C)有向图中的极小连通子图 D)有向图中的极大连通子图 4.n个结点的完全有向图含有边的数目(D) A)n*n B)n(n+1) C)n/2 D)n*(n-1) 5.关键路径是(A) A)AOE网中从源点到汇点的最长路径 B)AOE网中从源点到汇点的最短路径 C)AOV网中从源点到汇点的最长路径 D)AOV网中从源点到汇点的最短路径 6.有向图中一个顶点的度是该顶点的(C) A)入度B)出度C)入度与出度之和D)(入度+出度)/2 7.有e条边的无向图,若用邻接表存储,表中有(B)边结点。 A) e B)2e C)e-1 D)2(e-1) 8.实现图的广度优先搜索算法需使用的辅助数据结构为(B)

各种排序算法,数据结构中的排序算法

1.直接插入排序 //InsertSort.cpp //This function is to sort SqList # include # include # define MAXSIZE 20 # define MAX_LENGTH 100 typedef int RedType; typedef struct //define structure SqList { RedType r[MAXSIZE+1]; int length; }SqList; void InsertSort(SqList &L) //InsertSort() sub-function { int i,j; for(i=2;i<=L.length;++i) if(L.r[i]>L.length; for(i=1;i<=L.length;++i) { cout<<"Please input the "<>L.r[i]; } cout< # include

数据结构(本)期末综合练习

数据结构(本)期末综合练习 综合练习一 一、单项选择题 1.设有头指针为head的带有头结点的非空单向循环链表, 指针p指向其尾结点, 要删除头结点,并使其仍为单向循环链表,则可利用下述语句head =head->next ;()。 A.p =head; B.p=NULL; C.p->next =head; D.head=p; 2.在一个单链表中p指向结点a, q指向结点a的直接后继结点b,要删除结点b,可执行()。 A.p->next=q->next ; B.p=q->next; C.p->next=q; D.p->next=q; 3. 以下说法不正确的是 A. 线性表的链式存储结构不必占用连续的存储空间 B.一种逻辑结构只能有唯一的存储结构 C. 一种逻辑结构可以有不同的存储结构 D.线性表的顺序存储结构必须占用连续的存储空间 4.在一个单向链表中,在p所指结点之后插入一个s所指的结点时,可执行();和p->next=s; A.p= s; B.p->next=s->next; C.p=s->next; D.s->next=p->next; 5.把数据存储到计算机中,并具体体现( )称为物理结构。 A. 数据元素间的逻辑关系 B.数据的处理方法 C.数据的性质 D.数据的运算 6.设有一个长度为23的顺序表,要删除第8个元素需移动元素的个数为()。 A.16 B.14 C.15 D.13 7.链表所具备的特点之一是()。 A.可以随机访问任一结点B.需要占用连续的存储空间 C.插入元素的操作不需要移动元素D.删除元素的操作需要移动元素 8.设一棵有8个叶结点的二叉树,度数为1的结点有3个,则该树共有() 个结点。 A.20 B.18 C.17 D.16 9.图状结构中数据元素的位置之间存在()的关系。 A.一对一B.多对多 C.一对多D.每一个元素都有一个直接前驱和一个直接后继 10.一棵具有5层的完全二叉树,最后一层有4个结点,则该树总共有()个结点。 A.14 B.15 C.19 D.18 11.元素15,9,11,13按顺序依次进栈,则该栈的不可能输出序列是() (进栈出栈可以交替进行)。 A.13,11,9,15 B.15,9,11,13 C.13,11,15,9 D.9,15,13,11 12.设主串为“FABcCDABcdEFaBc”,以下模式串能与主串成功匹配的是()。 A. EFaBc B. ABCdE C. DABCC D .FAbcC 13.设有一个14阶的对称矩阵A(第一个元素为a1,1),采用压缩存储的方式,将其下三角部分以行序为主序存

数据结构C实现排序:直接插入、归并和快速排序(递增)学号

实验课题: 【用C描述课本的同学】有以下结构体构成的数组: struct StudentInfo { char ID[10]; char * name; float score; }StuInfo[12]= { {"0800301105", "JACK", 95}, {"0800201505", "LUN", 85}, {"0400820115", "MARY", 75.5}, {"0400850122", "KATE", 78.9}, {"0500201011", "LILI", 88}, {"0800401105", "JACK", 96}, {"0600830105", "JAN", 98.4}, {"0952520012", "SAM", 75}, {"9721000045", "OSCAR", 64}, {"0700301105", "JACK", 97}, {"0458003312", "ZOE", 68.9}, {"0400830211", "BOBI", 87.6} }; 1 使用直接插入的排序方法按照学号的顺序对以上数组进行排序(递增); 2 分别用归并排序和快速排序按照姓名的顺序对以上数组进行排序(递增),有3人的名字是"JACK",注意观察排序是否稳定。 程序代码: 第一种: #include #include #include #include #define Cutoff (3) struct StudentInfo { char ID[10]; char * name; double score; }StuInfo[12]= {

数据结构综合练习题

数据结构综合练习题

数据结构(一) 一、选择题 1.组成数据的基本单位是( C )。 (A) 数据项(B) 数据类型(C) 数据元素(D) 数据变量 2.设数据结构A=(D,R),其中D={1,2,3,4},R={r},r={<1,2>,<2,3>,<3,4>,<4,1>},则数据结构A 是( C )。 (A) 线性结构(B) 树型结构(C) 图型结构(D) 集合 3.数组的逻辑结构不同于下列( D )的逻辑结构。(A) 线性表(B) 栈(C) 队列(D) 树 4.二叉树中第i(i≥1)层上的结点数最多有(C )个。 (A) 2i (B) 2i(C) 2i-1(D) 2i-1 5.设指针变量p指向单链表结点A,则删除结点A的后继结点B需要的操作为(A )。 (A) p->next=p->next->next (B) p=p->next (C) p=p->next->next (D) p->next=p 6.设栈S和队列Q的初始状态为空,元素E1、E2、E3、E4、E5和E6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出列的顺序为E2、E4、E3、E6、E5和E1,则栈S的容量至少应该是( C )。 (A) 6 (B) 4 (C) 3 (D) 2

7.将10阶对称矩阵压缩存储到一维数组A中,则数组A 的长度最少为( C )。 (A) 100 (B) 40 (C) 55 (D) 80 8.设结点A有3个兄弟结点且结点B为结点A的双亲结点,则结点B的度数数为( B )。 (A) 3 (B) 4 (C) 5 (D) 1 9.根据二叉树的定义可知二叉树共有( B )种不同的形态。 (A) 4 (B) 5 (C) 6 (D) 7 10.设有以下四种排序方法,则( B )的空间复 杂度最大。 (A) 冒泡排序(B) 快速排序(C) 堆排序(D) 希尔排序 11、以下说法正确的是( A ) A.连通图的生成树,是该连通图的一个极小连通子图。 B.无向图的邻接矩阵是对称的,有向图的邻接矩阵一定是不对称的。 C.任何一个有向图,其全部顶点可以排成一个拓扑序列。 D.有回路的图不能进行拓扑排序。 12、以下说法错误的是 ( D ) A.一般在哈夫曼树中,权值越大的叶子离根结点越近 B.哈夫曼树中没有度数为1的分支结点 C.若初始森林中共有n裸二叉树,最终求得的哈夫曼树

数据结构第3阶段测试题

第三阶段测试卷 考试科目:《数据结构》第五章至第七章(总分100分)时间:90分钟______________学习中心(教学点)批次:层次: 专业:学号:身份证号: 姓名:得分: 一、选择题(每题3分,共30分) 1、m阶B树中的一个分支结点最多含(C)个关键字。 A、m-1B、mC、m+1D、[m/2]-1E、[m/2]F、[m/2]+1 2、设有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表,至少要进行(B)次探测。 A、k-1B、kC、k+1D、k(k-1)/2 3、设表中含100个数据元素,用折半查找法进行查找,则所需最大比较次数为(A)。 A、50B、25C、10D、7 4、设哈希表地址范围为0~19,哈希函数H(key)=key%17,使用二次探测再散列法处理冲突。若表中已存放有关键字值为6、22、38、55的记录,则再放入关键字值为72的记录时,其存放地址应为(D)。 A、2B、3C、4D、7E、8F、以上都不对 5、直接插入排序在最好情况下的时间复杂度为(D)。 A、O(logn)B、O(n)C、O(n*logn)D、O(n2) 6、将两个各有n个元素的有序表归并成一个有序表,最少进行(E)次比较。 A、nB、2n-1C、2nD、n-1 7、设有一组关键字值(46,79,56,38,40,84),则用快速排序的方法,以第一个记录为基准得到的一次划分结果为(D)。 A、38,40,46,56,79,84B、40,38,46,79,56,84 C、40,38,46,56,79,84D、40,38,46,84,56,79 8、外部排序是指(B)。 A、在外存上进行的排序方法 B、不需要使用内存的排序方法 C、数据量很大,需要人工干预的排序方法 D、排序前后数据在外存,排序时数据调入内存的排序方法 9、下述文件中适合于磁带存储的是(C)。

数据结构第九、十章 作业答案

第九章 查找 一、填空题 1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。 2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索 表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。设有100个结点,用二分法查找时,最大比较次数是 7 。 3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ,其下标从小到大依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。 解:显然,平均查找长度=O (log 2n )<5次(25)。但具体是多少次,则不应当按照公式 )1(log 12++=n n n ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。因为这是在假设n =2m -1 的情况下推导出来的公式。应当用穷举法罗列: 全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!! 4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它 将依次与表中元素 28,6,12,20 比较大小。 5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。 6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。 7. 有一个表长为m 的散列表,初始状态为空,现将n (n

数据结构经典七种排序方法

算法名称:选择排序 算法定义:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。算法类型:不稳定排序 算法时间复杂度:O(n2)--[n的平方] 最少移动次数:0 最多移动次数:3(n-1) 算法适用场景:这个算法时间复杂度偏高,一般不选择使用。 算法代码: void select_sort(int *x, int n) { int i, j, min, t; for (i=0; i

算法定义:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 算法类型:稳定排序 算法时间复杂度:O(n2)--[n的平方] 算法适用场景:这个算法时间复杂度偏高,一般不选择使用。 算法代码: void insert_sort(int *x, int n) { int i, j, t; for (i=1; i =0 && t <*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/ { *(x+j+1) = *(x+j); /*如果满足条件就往后挪。最坏的情况就是t 比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j+1) = t; /*找到下标为i的数的放置位置*/ } } ======================================================================= ======================================================================= 算法名称:冒泡排序 算法定义:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

计算机专业基础综合数据结构(排序)历年真题试卷汇编1

计算机专业基础综合数据结构(排序)历年真题试卷汇编1 (总分:72.00,做题时间:90分钟) 一、单项选择题(总题数:15,分数:30.00) 1.下列序列中,( )是执行第一趟快速排序后所得的序列。【福州大学1998一、9(2分)】 A.[68,11,18,69] [23,93,73] B.[68,11,69,23] [18,93,73] C.[93,73][68,11,69,23,18] √ D.[68,11,69,23,18] [93,73] 枢轴是73。 2.适合并行处理的排序算法是( )。【西安电子科技大学2005一、8(1分)】【电子科技大学2005一、8(1分)】 A.选择排序 B.快速排序√ C.希尔排序 D.基数排序 3.一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( )。【北京交通大学2005一、8(2分)【燕山大学2001一、4(2分)】 A.(38,40,46,56,79,84) B.(40,38,46,79,56,84) C.(40,38,46,56,79,84) √ D.(40,38,46,84,56,79) 如何对一趟快速排序的结果在最短的时间内做出正确判断,这里给出建议:首先84应该不动,所以D排除了;接着40应调到序列首,所以A排除了;接着79应调到移走40的空位上,B排除了。选择答案C,不必再继续做了(假定确有唯一正确答案)。 4.下列排序算法中,( )算法可能会出现下面的情况:初始数据有序时,花费的时间反而最多。【中南大学2005一、4(2分)】 A.快速排序√ B.堆排序 C.希尔排序 D.冒泡排序 5.将一组无序的数据重新排列成有序序列,其方法有:( )。【武汉理工大学2004一、8(3分)】 A.拓扑排序 B.快速排序√ C.堆排序√ D.基数排序√ 6.就平均性能而言,目前最好的内排序方法是( )排序法。【西安电子科技大学1998一、9(2分)】 A.冒泡 B.希尔插,A C.交换 D.快速√ 7.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( )方法最快。【清华大学1998一、2(2分)】 A.起泡排序 B.快速排列 C.Shell排序 D.堆排序√ E.简单选择排序

《数据结构》习题汇编07 第七章 图 试题

第七章图试题 一、单项选择题 1.在无向图中定义顶点的度为与它相关联的()的数目。 A. 顶点 B. 边 C. 权 D. 权值 2.在无向图中定义顶点 v i与v j之间的路径为从v i到达v j的一个()。 A. 顶点序列 B. 边序列 C. 权值总和 D. 边的条数 3.图的简单路径是指()不重复的路径。 A. 权值 B. 顶点 C. 边 D. 边与顶点均 4.设无向图的顶点个数为n,则该图最多有()条边。 A. n-1 B. n(n-1)/2 C. n(n+1)/2 D. n(n-1) 5.n个顶点的连通图至少有()条边。 A. n-1 B. n C. n+1 D. 0 6.在一个无向图中,所有顶点的度数之和等于所有边数的 ( ) 倍。 A. 3 B. 2 C. 1 D. 1/2 7.若采用邻接矩阵法存储一个n个顶点的无向图,则该邻接矩阵是一个 ( )。 A. 上三角矩阵 B. 稀疏矩阵 C. 对角矩阵 D. 对称矩阵 8.图的深度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 9.图的广度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 10.在用Kruskal算法求解带权连通图的最小(代价)生成树时,通常采用一个()辅助结构, 判断一条边的两个端点是否在同一个连通分量上。 A. 位向量 B. 堆 C. 并查集 D. 生成树顶点集合 11.在用Kruskal算法求解带权连通图的最小(代价)生成树时,选择权值最小的边的原则是该边不能 在图中构成()。 A. 重边 B. 有向环 C. 回路 D. 权值重复的边 12.在用Dijkstra算法求解带权有向图的最短路径问题时,要求图中每条边所带的权值必须是 ()。 A. 非零 B. 非整 C. 非负 D. 非正 13.在一个连通图中进行深度优先搜索得到一棵深度优先生成树,树根结点是关节点的充要条件是它至少 有()子女。

目前最完整的数据结构1800题包括完整答案 第十章 排序

第10章排序 一、选择题 1.某内排序方法的稳定性是指( )。【南京理工大学 1997 一、10(2分)】A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序法中( )排序法是不稳定性排序法。【北京航空航天大学 1999 一、 10 (2分)】 A. 插入 B. 冒泡 C. 二路归并 D. 堆积 3.下列排序算法中,其中()是稳定的。【福州大学 1998 一、3 (2分)】 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 4.稳定的排序方法是()【北方交通大学 2000 二、3(2分)】 A.直接插入排序和快速排序 B.折半插入排序和起泡排序 C.简单选择排序和四路归并排序 D.树形选择排序和shell排序 5.下列排序方法中,哪一个是稳定的排序方法?()【北方交通大学 2001 一、8(2分)】 A.直接选择排序 B.二分法插入排序 C.希尔排序 D.快速排序6.若要求尽可能快地对序列进行稳定的排序,则应选(A.快速排序 B.归并排序 C.冒泡排序)。 【北京邮电大学 2001 一、5(2分)】 7.如果待排序序列中两个数据元素具有相同的值,在排序前后它们的相互位置发生颠倒,则称该排序算法是不稳定的。()就是不稳定的排序方法。【清华大学 1998 一、3 (2分)】 A.起泡排序 B.归并排序 C.Shell排序 D.直接插入排序 E.简单选择排序 8.若要求排序是稳定的,且关键字为实数,则在下列排序方法中应选()排序为宜。 A.直接插入 B.直接选择 C.堆 D.快速 E.基数【中科院计算所 2000 一、5(2分)】 9.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。 A. 快速排序 B. 堆排序 C. 归并排序 D. 直接插入排序【中国科技大学 1998 二、4(2分)】【中科院计算所 1998 二、4(2分)】 10.下面的排序算法中,不稳定的是()【北京工业大学 1999 一、2 (2分)】 A.起泡排序 B.折半插入排序 C.简单选择排序 D.希尔排序 E.基数排序 F.堆排序。 11.下列内部排序算法中:【北京工业大学 2000 一、1 (10分每问2分)】A.快速排序 B.直接插入排序 C. 二路归并排序 D. 简单选择排序 E. 起泡排序F. 堆排序 (1)其比较次数与序列初态无关的算法是()(2)不稳定的排序算法是()(3)在初始序列已基本有序(除去n个元素中的某k个元素后即呈有序,k<

相关文档
最新文档