数据结构实验报告
数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。
二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。
在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。
三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。
2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。
3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。
4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。
5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。
四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。
2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。
通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。
3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。
链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。
在实现链表时,我们定义了一个节点结构,包含数据域和指针域。
通过指针的方式将节点连接起来,形成一个链式结构。
同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。
4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。
数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。
同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。
然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。
插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。
在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。
删除节点:同样需要根据删除位置的不同进行处理。
删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。
遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。
2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。
入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。
用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。
括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。
遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。
数据结构实验实训报告范文

一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。
2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。
3. 培养动手实践能力,提高编程水平。
二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。
数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。
具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。
2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。
3、提高程序设计的规范性和可读性,培养良好的编程习惯。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。
实现顺序表的初始化、插入、删除、查找等基本操作。
2、链表的实现定义链表节点结构体,包含数据域和指针域。
实现链表的创建、插入、删除、遍历等操作。
(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。
实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。
2、队列的实现用循环队列或链式队列实现队列。
实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。
(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。
实现二叉树的创建、插入、删除节点等操作。
2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。
实现图的创建、添加边等操作。
2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。
四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。
在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。
数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告课程名:数据结构课程设计任课教师:梁作娟姓名:甘言海院系:信息科学与工程学院专业年级:2010级计算机信息保密数据结构实验报告一、实验目的1.熟练掌握几种内部排序算法并比较他们效率的高低。
2.学会运用统计的方法评价算法的好坏。
3.初步理解高效排序算法的思想,掌握几种基本的算法设计技巧。
4.学会分析算法复杂度,尝试进行算法的优化处理。
5.感受算法优劣对计算速度的影响。
二、实验要求1、用Visual C++实现冒泡排序、简单选择排序、直接插入排序、快速排序、希尔排序、堆排序、折半插入排序共七种排序算法。
2、每次至少用100000个数据对每种排序算法进行测试,实验用的数据不少于五组,比较各种排序算法的效率高低,将排序结果写入文件。
三、实验方法1、使用VC6.0创建一个windows窗体应用程序,在窗体上添加9个按钮控件和一个文本框控件。
2、9个按钮控件分别代表7种排序方法以及重新生成随机数和按从大到小的顺序生成数列两个方法,用户单击其中任何一个按钮都将调用其中一个方法。
3、文本框用于显示排序所用的时间。
4、每种排序算法在完成排序后都将排序结果写入特定的文件,文件名取排序算法的名称。
四、实验内容1、打开Visual C++,创建一个新的基于对话框的MFC窗体应用程序,在生成的窗体上添加11个按钮控件和一个文本框控件,并修改11个按钮控件标签为“冒泡排序”、“简单选择”、“直接插入”、“快速排序”、“希尔排序”、“堆排序”、“折半插入”、“从小到大”、“从大到小”、“随机生成”、“清空文本框”。
2、添加头文件head.h,并在其中添加宏定义#define Num 100000,作为要排序的数据个数。
3、在窗体的类定义中添加公共属性arry和arry1,arry是要排序的数组首地址,其定义为long arry[Num+1],在窗体的构造函数中以随机序列的方式对arry 进行初始化,通过重置函数也可以对arry数组重新赋值,重置函数有三个,可以通过点击按钮“从小到大”、“从大到小”或者“随机生成”来调用,分别以三种不同的方式给数组重新赋值。
arry1是和arry同类型的数组首地址,arry1作为arry的副本,在每次进行排序时都首先将arry数组中的值原样复制到arry1中,然后对arry1进行排序,这样就能保证arry数组的值保持不变。
4、为添加的11个按钮控件添加事件处理程序,分别为7个排序算法、3个重置函数和1个用于清空文本框的函数,三个重置函数分别以“从小到大”、“从大到小”和“随机”的方式对arry数组重新赋值。
5、修改编译器默认堆栈的大小以满足快速排序的要求,编译并连接程序,逐步修改程序中的错误,直到程序能够连接成功。
6、 运行程序,分别用7种排序算法对生成的含有100000个数据的伪随机序列进行排序,对每种排序算法记录下排序时间。
然后单击“随机生成”,换一组随机序列重新进行,同样的操作进行5遍,求各种算法排序时间的平均值。
7、 单击“从小到大”按钮,按从小到大的顺序对arry 数组赋值,然后用这个有序的数组对七种排序算法进行测试,对每种排序算法记录下排序时间,同样进行五次,求每种排序算法所用时间的平均值。
8、 最后单击“从大到小”按钮,产生按从大到小的顺序排列的数列,再次对七种排序算法进行测试,每次记下排序时间,同样的操作进行五次求平均值。
9、 在头文件head.h 中将宏定义更改为#define Num 300000,重新进行实验,对比观察排序算法对数据量的敏感程度。
10、 按照前面几步的实验结果绘制图表,比较七种排序算法的效率高低。
五、实验结果1、 程序运行效果截图2、 乱序排序时间表冒泡排序 简单选择排序 直接插入排序 快速排序 希尔排序 堆排序 折半插入排序 第一次 81.406 37.375 21.234 0.063 0.500 0.062 20.703 第二次 81.766 34.187 19.875 0.062 0.578 0.063 21.422 第三次 80.453 34.313 21.172 0.063 0.625 0.063 22.125 第四次 76.562 36.359 20.016 0.062 0.828 0.062 35.078 第五次 60.593 25.672 14.625 0.016 0.359 0.031 15.719 平均 76.15633.581 19.384 0.0530.5780.05623.009表一(数据量10万)排序方法时 间 (s) 次数冒泡排序 简单选择排序 直接插入排序 快速排序 希尔排序 堆排序 折半插入排序 第一次 556.281 223.609 135.469 0.078 3.437 0.110 142.109 第二次 550.453 237.734 133.422 0.078 3.344 0.109 144.218 第三次 543.781 228.281 136.281 0.078 3.531 0.109 151.109 第四次 484.468 236.328 141.500 0.094 3.672 0.125 146.672 第五次 581.672 232.672 143.312 0.110 3.797 0.109 147.500 平均543.331231.725 137.997 0.0883.5560.112146.322表二(数据量30万)100200300400500600时间(秒)1030数据量(万)乱序排序时间柱状图冒泡排序简单选择排序直接插入排序快速排序希尔排序堆排序折半插入排序3、 顺序排序时间表冒泡排序 简单选择排序 直接插入排序 快速排序 希尔排序堆排序折半插入排序 第一次 0.000 24.188 0.000 24.156 0.000 0.016 0.000 第二次 0.000 23.907 0.000 24.968 0.000 0.016 0.000 第三次 0.016 24.375 0.000 25.515 0.000 0.016 0.000 第四次 0.000 24.219 0.000 25.609 0.000 0.015 0.000 第五次 0.000 24.234 0.000 25.750 0.000 0.015 0.016 平均0.003 24.1850.000 25.200 0.000 0.015 0.003 表三(数据量10万)冒泡排序 简单选择排序 直接插入排序 快速排序 希尔排序堆排序 折半插入排序 第一次 0.000 225.531 0.000 224.359 0.0000.078 0.031 第二次 0.000 220.897 0.000 221.034 0.000 0.078 0.031 第三次 0.001 233.152 0.000 234.828 0.000 0.078 0.031 第四次 0.000 214.512 0.002 240.010 0.000 0.079 0.031 第五次 0.000 252.062 0.000 238.844 0.000 0.078 0.031 平均0.000232.144 0.000 233.3200.0000.0780.031表四(数据量30万)排序方法时 间 (s)次数排 序 方 法 时间(s)次数排 序 方 法 时间(s)次数50100150200250时间(秒)1030数据量(万)乱序排序时间柱状图冒泡排序简单选择排序直接插入排序快速排序希尔排序堆排序折半插入排序4、 逆序排序时间表冒泡排序简单选择排序 直接插入排序 快速排序 希尔排序堆排序折半插入排序 第一次 63.250 39.516 29.843 27.578 0.454 0.047 33.828 第二次 62.890 39.218 29.891 29.234 0.672 0.047 34.516 第三次 57.422 35.968 28.656 23.750 0.671 0.047 34.547 第四次 61.141 36.984 31.563 26.421 0.672 0.047 34.110 第五次 66.656 37.969 29.906 24.594 0.672 0.047 32.891 平均62.272 37.93129.972 26.315 0.628 0.047 33.978 表五(数据量10万)冒泡排序 简单选择排序 直接插入排序 快速排序 希尔排序堆排序 折半插入排序 第一次 578.141 248.157 290.891 233.968 7.9530.094 306.313 第二次 552.078 240.688 264.344 214.828 6.750 0.078 282.906 第三次 554.045 245.230 280.783 230.234 7.822 0.090 302.208 第四次 560.788 246.344 276.355 220.788 7.052 0.080 298.420 第五次 556.922 228.797 279.109 220.344 8.203 0.078 295.687 平均562.380239.214 278.115 223.0477.6350.083298.846表六(数据量30万)排 序方 法时 间 (s) 次数排 序 方 法 时间(s)次数100200300400500600时间(秒)1030数据量(万)乱序排序时间柱状图冒泡排序简单选择排序直接插入排序快速排序希尔排序堆排序折半插入排序六、实验结果分析1、 对乱序来说排序效率最高的是快速排序和堆排序,其次是希尔排序,然后是直接插入排序和折半插入排序,然后是简单选择排序,最慢的是冒泡排序。
2、 对于已经按从小到大的顺序排列好的数列,冒泡排序、直接插入排序、希尔排序、折半插入排序,基本不需要花费任何时间,堆排序需要少量时间,简单选择排序和快速排序效率较低。
3、 对于逆序来说,效率最高的是堆排序,其次是希尔排序,然后快速排序、简单选择排序、直接插入排序、折半插入排序的效率相差很小,冒泡排序的效率最低。
4、 综合来看堆排序、快速排序和希尔排序是较好的排序算法,对各种序列进行排序的效率都很高。
5、 快速排序由于采用递归函数的方法实现,在运行时由于编译器分配的栈的大小的限制,递归调用的层数受到限制。
在对顺序和逆序的数列进行排序时由于需要递归调用的层数比较多,程序运行可能会被意外终止,可以在调试之前通过设置编译器的堆栈大小来满足快速排序的需要。
6、 快速排序对乱序的排序效率非常高,但是对于顺序或者逆序的序列来说,排序所需时间较大,但这种情况出现的可能性较低,所以从统计的角度来讲,它仍是一种高效的排序方法,其效率和堆排序相当。