排序综合数据结构课程设计论文
数据结构课程设计-排序
![数据结构课程设计-排序](https://img.taocdn.com/s3/m/c123d78fec3a87c24028c43c.png)
一、问题描述1、排序问题描述排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。
简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。
本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。
我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。
其中包括:(1)插入排序的有关算法:不带监视哨的直接插入排序的实现;(2)交换排序有关算法:冒泡排序、快速排序的实现;(3)选择排序的有关算法:直接选择排序、堆排序的实现;(4)归并排序的有关算法:2-路归并排序的实现。
2、界面设计模块问题描述设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。
界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。
二、问题分析本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。
冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。
冒泡排序的步骤:1)置初值i=1;2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j]与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置;3)i=i+1;4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止;要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。
排序综合课程设计
![排序综合课程设计](https://img.taocdn.com/s3/m/728b83c95f0e7cd18525367c.png)
.大连科技学院数据结构课程设计题目排序综合学生专业班级指导教师职称副教授所在单位信息科学系软件教研室教学部主任完成日期2013 年1月11 日.课程设计报告单学号专业班级网络工程11-1考核项目评分备注平时工作态度及遵守纪律情况1(10 分)掌握基本理论、关键知识、基本技能的程度和2阅读参考资料的水平(10 分)独立工作能力、综合运用所学知识分析和解决3问题能力及实际工作能力提高的程度(20 分)完成课程设计说明书及软件的情况与水平(小组分工情况、规性、整洁清楚、叙述完整性、4思路清晰程度、工作量及实际运行情况和创新性)(60 分)总评成绩综合评定:(优、良、中、及格、不及格)指导教师签字:2013年1月11日数据结构课程设计任务书一、任务及要求:1.设计(研究)任务和要求研究容:排序综合任务和要求:(1)学习数据结构基础知识,掌握数据结构典型的算法的使用。
(2)对指导教师下达的题目进行系统分析。
(3)根据分析结果完成系统设计。
(4)编程:在计算机上实现题目的代码实现。
(5)完成对该系统的测试和调试。
(6)提交课程设计报告。
要求完成课程设计报告3000 字以上 (约二十页 )。
完成若干综合性程序设计题目,综合设计题目的语句行数的和在100 行语句以上。
2.原始依据结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.参考题目:二、工作量2 周( 10 个工作日)时间三、计划安排第 1 个工作日:查找相关资料、书籍,阅读示例文档,选择题目。
第 2 个工作日-第 3 个工作日:设计程序结构、模块图。
第 4 个工作日-第 9 个工作日:完成程序的编码,并且自己调试、测试。
穿插进行课程设计报告的撰写。
第 10 个工作日:上交课程设计报告,由教师检查软件测试效果、检查课程设计报告,给出学生成绩。
数据结构之排序算法操作论文1111111111 - 副本
![数据结构之排序算法操作论文1111111111 - 副本](https://img.taocdn.com/s3/m/6fda176148d7c1c708a145c0.png)
排序算法操作课程名称:数据结构研究论文题目:排序算法操作院系:学生姓名:学号:专业班级:年月日数据结构之排序算法操作摘要:本文通过对数据结构中排序算法深入研究,实现了排序算法中的直接插入排序、快速排序和简单选择排序操作,进一步加深了对数据结构中排序算法的理解,得到的算法可以应用到以后的编程实践中。
关键词:排序时间复杂度空间复杂度稳定性1.引言排序是日常生活和工作中的一个常见问题,其目的是将一组原本无序的数据元素(或记录)序列,按照人们所需要的顺序,排列成有规律的按关键字有序的序列。
在现实生活中,人们要用到排序。
如:学生成绩往往需要按照成绩高低或按学号从前到后排序;在图书馆众多的图书中,需要按照各个学科将书籍归类;排队时从高到低的顺序排队等问题。
同样,排序也是计算机程序设计中的一个非常重要的操作,在计算机软件设计中占有极其重要的地位。
本文将对排序算法中直接插入排序、快速排序和简单选择排序三种算法的实现做一些研究。
2.算法的实现直接插入排序算法中,第i趟进行的操作为:在含有i-1个记录的有序子序列r[1…i-1]中插入一个记录r[i]后,变成含有i个记录的有序子序列r[1….i];并且为了在查找插入位置的过程中避免数组下标出界,在r[0]处设置监视哨,在自i-1起往前搜索的过程中,可以同时后移记录。
算法1 直接插入排序算法Step1:从第二个记录起逐个进行关键字与前面关键字的比较并判断是否把该记录作为哨兵for ( i=2; i<=L.length; ++i )if(LT(L.r[i].key, L.r[i-1].key))L.r[0] = L.r[i]; //若“<”,将L.r[i]复制为哨兵Step2:在进行关键字比较的同时后移记录for ( j=i-1; LT( L.r[0].key, L.r[j].key ); --j )L.r[j+1] = L.r[j]; //记录后移Step3:把记录插入到正确的位置L.r[j+1] = L.r[0]; //插入到正确位置快速排序算法中,一趟快速排序的具体作法为:附设两个指针low 和high,他们的初值分别为low和high,设枢轴的关键字为pivokey,则首先从high所指位置起向前搜索找到第一个关键字小于pivokey 的记录和枢轴记录相互交换,然后从low所指位置起向后搜索,找到第一个关键字大于的pivokey记录和枢轴记录相互交换,重复这两步直至low=high为止。
综合排序正式论文
![综合排序正式论文](https://img.taocdn.com/s3/m/4bb3d2f9c281e53a5902ffc2.png)
目录一、问题描述 (1)2.1 基本要求: (1)2.2. 算法思想: (1)2.3. 模块划分: (3)2.4. 数据结构: (16)2.5. 源程序: (17)2.6. 测试情况: (27)三、小结 (34)四、参考文献 (35)一、问题描述用C语言编程解决插入、冒泡,快速排序,简单选择,堆排序以及分析各种算法的时间复杂度和空间复杂度,比较各种排序在不同场合的适用程度,分析各种排序算法的实用性。
内容简介2.1 基本要求:(1)设计一个的菜单将在实现的功能显示出来,并有选择提示;(2)分别实现直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序,堆排序算法;(3)通过多种测试数据,对各种排序算法的时间复杂度和空间复杂度进行比较2.2. 算法思想:2.2.1简单选择排序<1> 基本思想每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个关键字。
2.2.2 直接插入排序<1> 基本思想插入排序的思想就是读一个,排一个,将第1个数放入数组的第1个元素中,以后读入的数与已存入数组的数进行比较,确定它在从大到小的排列中应处的位置.将该位置以及以后的元素向后推移一个位置,将读入的新数填入空出的位置中.2.2.3折半插入排序<1>基本思想从第二个数开始逐个置入监视哨,使用low,high标签进行折半判断比较大小,并确认插入位置,该位置到最后一个数全部后移一位,最后腾出该位置,把监视哨里面的数置入该位置。
后面的数以此类推进行排序,直到最后一个数比较完毕。
2.2.4希尔排序<1> 基本思想希尔排序法是1959年由D.L.Shell提出来的,又称减少增量的排序。
下表是以八个元素排序示范的例子.在该例中,开始时相隔4个成分,分别按组进行排序,这时每组2个成分,共4组; 然后相隔2个成分,在按组排序......最后,对所有相邻成分进行排序.2.2.5冒泡排序<1> 基本思想依次比较相邻的两个数,把大的放前面,小的放后面.即首先比较第1个数和第2个数,大数放前,小数放后.然后比较第2个数和第3个数......直到比较最后两个数.第一趟结束,最小的一定沉到最后.重复上过程,仍从第1个数开始,到最后第2个数.然后...... 由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序.2.2.6快速排序<1> 基本思想快速排序的基本思想是基于分治策略的。
排序综合-课程设计报告
![排序综合-课程设计报告](https://img.taocdn.com/s3/m/1a2fa18d3968011ca30091db.png)
课程设计课程设计名称:专业班级:学生姓名:学号:指导教师:排序综合0000000000000 0000000000000 00000000000000 00000000000000课程设计时间:2010621 -2010625计算机科学与技术专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页信息科学与工程学院课程设计成绩评价表信息科学与工程学院课程设计成绩评价表课程名称:数据结构课程设计设计题目:排序1、需求分析1.1、直接插入排序思路:设有一组关键字{K1,K2,…….,Kn},排序开始变认为K1是一个有序的序列, 让K2插入到表长为1的有序序列,使之成为一个表长为2的有序序列,让K3插入到表长为2的有序序列,使之成为一个表长为3的有序序列,依次类推,最后让Kn插入上述表长为n-1的有序序列,得到一个表长为n的有序序列.1.2、希尔排序思路:先取一个正整数d1(d1<n)把全部记录分成di个组,所有距离为di的倍数的记录看成是一组,然后在各组内进行插入排序;然后取d2(d2<d1),重复上述分组和排序操作,直到取di=1(>=1),即所有记录成为一个组为此.一般选di约为n/2,d2 为d1/2,…….,di=11・3、快速排序:(递归和非递归)思路:以第一个关键字K1为控制字,将[Ki、K2、….K n]分成两个子区,使左区的有关键字小于等于K1 ,右区所有关键字大于等于K1,最后控制居两个子区中间的适当位置。
在子区内数据尚处于无序状态。
将右区首、尾指针保存入栈,对左区进行与第(1)步相类似的处理,又得到它的左子区和右子区,控制字区中。
重复第(1)、(2)步,直到左区处理完毕。
然后退栈对一个个子区进行相类似的处理,直到栈空分区处理函数hoare思路:首先用两个指针i、j分别指向首、尾两个关键字,i=1,j=8。
如对(46、56、14、43、95、10、19、72)。
排序系统设计数据结构课程设计
![排序系统设计数据结构课程设计](https://img.taocdn.com/s3/m/1d821674e2bd960590c677c2.png)
数据结构课程设计题目:排序系统设计班级:姓名学号:同组人姓名:起迄日期: 2014.12.28-2015.01.04 课程设计地点:指导教师:完成日期:2014年12月目录一、问题描述 (3)二、概要设计 (4)三、详细设计 (6)四、程序调试与测试 (12)五、实验心得 (14)六、程序代码............................................................. 错误!未定义书签。
参考文献 (15)一、问题:1.题目13:排序系统设计功能:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。
开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。
如此下去,直到所有人全部出列为止。
令n最大值取30。
要求设计一个程序模拟此过程,求出出列编号序列。
1.分步实施:1初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2完成最低要求:建立一个文件,包括某人5个人的情况。
3进一步要求:有兴趣的同学可以自己扩充系统功能。
2.要求:1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、概要设计1、循环链表抽象数据类型定义typedef struct LNode//定义单循环链表中节点的结构{int num;//编号int pwd;//passwordstruct LNode *next;//指向下一结点的指针}LNode;2、本程序包含一下几个模块(1)构造结点模块LNode *createNode(int m_num,int m_pwd){LNode *p;p=(LNode *)malloc(sizeof(LNode));//生成一个结点p->num=m_num;//把实参赋给相应的数据域p->pwd=m_pwd;p->next=NULL;//指针域为空return p;}(2)创建链表模块void createList(LNode *ppHead,int n)(3)出队处理模块void jose(LNode *ppHead,int m_pwd)(4)约瑟夫环说明输出模块void instruction()(5)菜单模块void menu()(6)主函数模块int main()函数的调用关系图如下:三、详细设计1.主函数图4 主函数数据流程图根据流程图,主函数程序如下:int main(){int n,m,x;LNode *ppHead=NULL;menu();for(;;){printf("\n请选择要执行的操作:");scanf("%d",&x);system("cls");switch(x){case 1:printf("*************************************************************** *\n");printf("约瑟夫环:\n");printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");printf("按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n");printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");printf("直到所有人全部出列为止.编程打印出列顺序.\n");printf("*************************************************************** *\n");main();break;case 2:printf("\n请输入总人数n:");scanf("%d",&n);printf("请输入开始上限数m:");scanf("%d",&m);createList(&ppHead,n);printf("\n");printf("出队顺序:\n");jose(ppHead,m);printf("\n约瑟夫环游戏结束!\n");main();break;case 0:exit(0);default:system("cls");printf("\n您选择的操作有误,请重新选择...\n\n\n");main();}}return 0;}2.链表的创建图5 创建链表函数的数据流程图/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指向的数据元素为p,后续为"空"的节点,再把P插入循环链表ppHead中*/根据流程图,创建链表函数程序如下:void createList(LNode **ppHead,int n)int i,m_pwd;LNode *p,*cur;//cur:浮标指针for(i=1;i<=n;i++){printf("输入第%d个人的密码:",i);scanf("%d",&m_pwd);//输入持有密码p=createNode(i,m_pwd);//调用构造结点函数if(*ppHead==NULL)//如果头结点为空{*ppHead=cur=p;//生成头结点,让cur指向他cur->next=*ppHead;//cur的指针域指向自身}else//如果不为空,则插入结点{p->next = cur->next;cur->next = p;cur= p;//cur指向新插入结点}}printf("完成创建!\n"); //提示链表创建完成}3.出队处理图6 出队函数的数据流程图/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释放ppHead,如此循环,直至把所有节点都打印和删除为止!*/根据流程图,出队函数程序如下:void jose(LNode *ppHead,int m_pwd){int i,j;LNode *p,*p_del;//定义指针变量for(i=1;p!=ppHead;i++){for(j=1;j<m_pwd;++j){p=ppHead;//p赋值为ppHead,p指向要删除结点的前一个结点ppHead=ppHead->next;//ppHead指向下一个元素}p->next = ppHead->next;//p结点与头结点链接i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->num,j为要删除的密码值printf("第%d个人出列,密码:%d\n",j,i);m_pwd=ppHead->pwd;//m_pwd赋值为ppHead->pwdfree(ppHead);//释放头结点ppHead=p->next;//ppHead重新赋值给p->next,即释放前的ppHead->pwd 指针//删除报数结点}i=ppHead->pwd;//i赋值为ppHead->pwdj=ppHead->num;//j赋值为ppHead->numprintf("最后一个出列是%d号,密码是:%d\n",j,i);free(ppHead);//释放头结点}4. 约瑟夫环说明模块void instruction(){printf("*************************************************************** *\n");printf("约瑟夫环:\n");printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");printf("按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n");printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");printf("直到所有人全部出列为止.编程打印出列顺序.\n");printf("******************************************************\n");return 0;}5. 菜单模块void menu(){printf("**************************约瑟夫环*****************************\n");printf("\n");printf(" [1]约瑟夫环问题的阐述\n");printf(" [2]按要求求解约瑟夫环\n");printf(" [0]退出\n");printf("************************** 欢迎使用!****************************\n");}四、程序调试与测试本程序开始运行界面如下:选择1进入问题。
《数据结构》课程设计报告
![《数据结构》课程设计报告](https://img.taocdn.com/s3/m/c7e6c25d91c69ec3d5bbfd0a79563c1ec5dad7e2.png)
《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。
本课程目标如下:1. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。
3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。
本课程针对高年级学生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。
在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。
通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。
2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。
3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。
4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。
教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。
数据结构论文
![数据结构论文](https://img.taocdn.com/s3/m/893e22916bec0975f465e284.png)
级课程(设计)论文题目阿克曼函数专业班级学号学生姓名指导教师指导教师职称学院名称完成日期:年月日武汉工程大学本科课程设计(论文)目录目录 (I)摘要 (II)前言 (II)第1章绪论 (1)1.1课题背景 (1)1.2课题意义 (1)1.3文献综述 (1)第2章课题的具体分析及程序的实现 (1)2.1 课题分析 (1)2.2 递归算法 (3)2.2.1 递归 (3)2.2.2 递归算法程序的设计 (3)2.2.3 实验结果 (3)2.3 利用栈的非递归算法 (9)2.3.1 栈 (9)2.3.2 主要成员函数的设计 (9)2.3.3利用栈的非递归算法程序的设计 (88)2.3.4实验结果 (99)2.4算法的复杂性分析 (10)2.5存在的问题及改进 (10)第3章总结 (11)致谢 (11)参考文献 (11)附录 (15)武汉工程大学本科课程设计(论文)摘要“数据结构”是计算机程序设计的重要理论技术基础,它是计算机学科的核心课程。
用数据结构中的知识、算法、思想解决一些实际问题可使得一些问题变得一目了然,易懂。
本课程设计的目的是通过C++语言平台实现阿克曼函数问题的算法设计,采用递归调用和以栈作为存储的非递归调用的方法解决,使抽象的数学问题程序化,并一目了然,更便于理解。
关键词:数据结构,阿克曼函数,递归,非递归武汉工程大学本科课程设计(论文)前言本文解决了递归和非递归方法实现阿克曼函数的问题,同时在非递归调用时利用了栈作为元素的存储空间。
全文共3章,详细的介绍了对本课题的算法设计过程及类容。
第1章介绍了课题背景和课题的意义。
在本章中,还给出了我们查阅并借用的一些参考文献的主要内容。
第2章主要介绍了课题的分析与算法的设计,对存在的问题作了简要分析并予以改进以及算法的复杂性的分析。
第3章是本次课程设计的总结。
全文的最后是致谢、参考文献和对程序优化处理的源代码。
高金金2011-1-6于武汉工程大学理学院武汉工程大学本科课程设计(论文)第1章 课题背景1.1课题背景阿克曼函数是数学中的经典问题,是非原始递归函数的例子。
数据结构课程设计 各种排序
![数据结构课程设计 各种排序](https://img.taocdn.com/s3/m/a60d07c108a1284ac85043e4.png)
数据结构课程设计课程设计题目:各种排序姓名:学号:2011112212班级:1122软件工程组长:李俊超指导老师:解德祥计算机与信息学院一、设计题目题目:各种排序任务:实现各种排序并分别时行分析要求:用随机数生成100个整数存入文本文件中,并对这些数进行多种方法进行排序。
至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)并将结果存入另外的文本文件中。
二.运行环境(软、硬件环境)操作系统Windows7运行环境Visual C++ 6.0三、算法设计的思想大架构采用模块化编程的思想,将每个不同的功能分别写成不同的子程序,分别进行封装构成各个小的模块,最后将各个模块组合起来。
在每个子程序的编写过程中特事特办面对不同的预想功能采取不同的数据结构不同的算法实现。
总体算法思想为按功能分块,依照预想功能实现顺序拼装。
具体思想请见流程图。
四、算法的流程图五、算法设计分析程序总体采用模块化设计,程序间通过传参和调用进行有机组合。
这样的总体布局将将各个功能隔离开来,每个模块负责每个模块的功能,使得程序的布局简单明了。
且子程序只有在被调用时才会运行大大节约系统资源减少了运算时间。
同时由于功能的隔离使得程序的扩展性大大提高,无论程序将要任何改动时,都会方便很多。
具体实现如图:工程一共包括9个文件,一个头文件“sort.h”,其中包括了对程序的预处理命令和程序将用到的所有函数的声明,其他8个文件分别是mian函数所在文件“sort.c”,显示数据函数实现的文件“Display.c”,文件保存函数实现的文件“save.c”,菜单函数实现的文件“Menu.c”,冒泡排序实现的文件“bubblesort.c”, 插入排序实现的文件“inssort.c”, 快速排序实现的文件“qksort.c”, 选择排序实现的文件“selectsort.c”.六、源代码*************************【sort.h】*********************** #include <stdlib.h>#include <stdio.h>#include <time.h>#define TRUE 1#define FALSE 0long rdnum[100];long sortednum[100];FILE *fp1,*fp2;char fname1[20];char fname2[20];void Save(FILE *fp,char fname[],int data[]);void bubblesort();void inssort();int qkpass(int r[],int left,int right);void qksort(int r[],int low, int high );void selectsort();void Display(long data[]);void Menu();*************************【sort.c】*********************** #include "sort.h"void main(){long i,rd;printf("系统将如下产生100个随机数\n\n");srand( (unsigned)time( NULL ) );for( i = 0; i < 100;i++ ){rd=rand();rdnum[i]=rd;}for (i=0 ; i<100 ; i++){sortednum[i]=rdnum[i];}Display(rdnum);Save(fp1,fname1,rdnum);Menu();printf("排序后结果为:\n\n");Display(sortednum);Save(fp2,fname2,sortednum);}***********************【Display.c】********************** #include "sort.h"void Display(long data[]){int i;for( i = 0; i < 100;i++ ){printf( "%d\t",data[i]);if ((i+1)%10==0&&i!=0) printf("\n"); //每隔10个数换行}}***********************【save.c】**********************#include "sort.h"void Save(FILE *fp,char fname[],long data[]){int i;printf("\n请输入存入以上数据的文件名,格式如下:(C:\\random number.txt)");scanf("%s",fname);if((fp=fopen(fname,"w"))==NULL){printf("\n不能打开文件,文件保存失败!");return;}for (i=0;i<100;i++){fprintf(fp,"%ld\t",data[i]);if ((i+1)%10==0&&i!=0) fprintf(fp,"\n");}printf("\n文件保存成功!\n\n");fclose(fp);}***********************【Menu.c】********************** #include"sort.h"void Menu(){int choice;printf("请选择一种排序方式:\n\n1.冒泡排序\t\t2.插入排序\n3.快速排序\t\t4.选择排序\n\n");printf("你的选择是:");while(1){scanf("%d",&choice);if(choice>=1 && choice<=6)break;elseprintf("\n输入数字不正确,请重输1-6: ");}printf("\n");switch(choice){case 1 : bubblesort(); break;case 2 : inssort(); break;case 3 : qksort(sortednum,0,99); break;case 4 : selectsort(); break;}}*********************【bubblesort.c】********************* #include "sort.h"void bubblesort(){int i,j;int change;long x;change=TRUE;for ( i=0 ; i<100 && change ;i++ ){change=FALSE;for ( j=0 ; j<100-i-1 ; j++)if (sortednum[j] > sortednum[j+1]){x= sortednum[j];sortednum[j]= sortednum[j+1];sortednum[j+1]= x;change=TRUE;}}}*********************【inssort.c】*********************#include "sort.h"void inssort(){int i,j,k;for (i=1; i<100; i++){k=sortednum[i];j=i-1;while (k< sortednum[j] ){sortednum[j+1]= sortednum[j];j=j-1;}sortednum[j+1]=k;}}**********************【qksort.c】********************** #include "sort.h"int qkpass(int r[],int left,int right){int x;int low,high;x= r[left];low=left;high=right;while ( low<high ){while (low< high && r[high]>=x )high--;if ( low <high ){r[low]= r[high];low++;}while (low<high && r[low]<x )low++;if ( low<high ){r[high]= r[low];high--;}}r[low]=x;return low;}void qksort(int r[],int low, int high ){int pos;if(low<high){pos=qkpass(r, low, high);qksort(r, low, pos-1);qksort(r, pos+1, high);}}**********************【selectsort.c】********************** #include "sort.h"void selectsort(){int i,j,k;int x;for ( i=0 ; i<100; i++){k=i;for ( j=i+1 ; j<100 ; ++j)if (sortednum[j] < sortednum[k] ) k=j;if ( k!=i){x= sortednum[i];sortednum[i]= sortednum[k];sortednum[k]=x;}}}七、运行结果分析系统产生100个随机数将产生的100个随机数存入一个自己选择的文本文档中,如果该路径不存在将在该路径新建一个该文本文档,我选择的是d:\1.txt选择一种排序方式对产生的随机数进行排序,我选择的是插入排序,也可以选择其他排序,结果是一样的,只是算法不同显示排序后的结果将排序后的结果存入另一个自己选择的文本文档中,如果该路径不存在将在该路径新建一个该文本文档,我选择的是d:\2.txt可以看到D盘确实多了两个文本文档(1.txt和2.txt),里面一个存放的是产生的100个随机数,另一个是排序后的结果,可见程序是成功的八、我的任务及课设心得我的任务:整个程序中我负责的部分是:1.产生随机数功能的编写2.文件保存功能的编写3.菜单功能的编写4.快速排序“qksort.c”代码的编写5.把所有人的代码串联起来成为一个完整的程序课设心得:整个程序前前后后整整用了一个星期,每天只要有空闲时间就在翻书本,画流程图写代码,反反复复一点一点。
数据结构课程设计参考论文
![数据结构课程设计参考论文](https://img.taocdn.com/s3/m/e653807dcdbff121dd36a32d7375a417876fc11e.png)
数据结构课程设计参考论文一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、栈、队列、树和图等常见数据结构的特点与应用场景。
2. 学会分析不同数据结构在解决实际问题中的优势与局限,并能选择合适的数据结构进行问题求解。
3. 掌握各类数据结构的存储表示和操作方法,了解其时间复杂度和空间复杂度。
技能目标:1. 培养学生运用数据结构知识解决实际问题的能力,提高编程实践技能。
2. 培养学生阅读和分析数据结构相关算法的能力,能对算法进行优化和改进。
3. 提高学生运用所学知识进行团队合作、沟通与表达的能力。
情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成积极的学习态度。
2. 培养学生的逻辑思维能力、创新意识和问题解决能力,增强自信心。
3. 培养学生遵循科学规范,严谨治学,养成良好的学术道德。
本课程旨在帮助学生掌握数据结构的基本知识,提高编程实践和算法分析能力,培养学生解决实际问题的综合素质。
针对学生的年级特点,课程内容注重理论与实践相结合,强调知识的应用性和实用性。
在教学过程中,注重启发式教学,激发学生的主动性和创造性,培养良好的学习习惯和团队合作精神。
通过本课程的学习,使学生能够为后续计算机专业课程打下坚实基础,为未来从事计算机相关领域工作提供有力支持。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,分析不同数据结构的特点与应用场景。
教材章节:第1章 数据结构概述2. 线性表:讲解线性表的定义、存储表示(顺序存储和链式存储),以及基本操作(插入、删除、查找等)。
教材章节:第2章 线性表3. 栈和队列:介绍栈和队列的基本概念、存储表示及操作方法,分析它们在实际应用中的作用。
教材章节:第3章 栈和队列4. 树和二叉树:讲解树和二叉树的基本概念、存储结构、遍历方法及其应用。
教材章节:第4章 树和二叉树5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表),以及图的遍历算法(深度优先搜索和广度优先搜索)。
排序(数据结构课程设计)
![排序(数据结构课程设计)](https://img.taocdn.com/s3/m/a0f0e012e87101f69e3195cf.png)
《数据结构》课程设计实验报告题目:排序(必做题)姓名:学号:指导老师:时间:2015.09.03目录一、设计内容和要求 (3)二、算法思想描述 (3)1. 希尔排序 (3)2. 快速排序 (3)3. 堆排序 (4)4. 归并排序 (7)5. 性能分析 (8)三、程序结构 (10)四、结果与分析 (10)五、收获与体会 (12)一、设计内容和要求设计内容:排序算法的实现与比较要求:编程希望实现希尔、快速、堆排序、归并排序算法。
要求随机产生10000个数据存入数据文件,然后读数据文件,分别采用不同的排序方法进行排序,将结果存入文件中。
二、算法思想描述1.希尔排序先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。
图解:2.快速排序首先选一个枢轴k(即比较的基准),通过一趟排序将待排序记录分割成独立的两部分,前一部分记录的关键码均小于或等于枢轴k,后一部分记录的关键码均大于或等于枢轴k,然后分别对这两部分重复上述方法,直到整个序列有序。
经过一次划分后枢轴k再对1、2区分别再进行快速排序3.堆排序筛选:假设当前要筛选结点的编号为k,堆中最后一个结点的编号为m,并且结点k的左右子树均是堆(即r[k+1] ~ r[m]满足堆的条件),则筛选算法用伪代码可描述为:图解:堆排序:堆排序的基本思想是:首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者即堆顶记录,然后将它从堆中移走(通常将堆顶记录和堆中最后一个记录交换),并将剩余的记录再调整成堆,这样又找出了次大的记录,以此类推,直到堆中只有一个记录为止。
(1)用大根堆排序的基本思想①先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区②再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys ≤R[n].key③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
数据结构课程设计排序实验报告
![数据结构课程设计排序实验报告](https://img.taocdn.com/s3/m/1a5c6d7cf8c75fbfc77db2d7.png)
《数据结构》课程设计报告专业班级姓名学号指导教师起止时间课程设计:排序综合一、任务描述利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。
(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。
并把排序后的结果保存在不同的文件中。
(2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
要求:根据以上任务说明,设计程序完成功能。
二、问题分析1、功能分析分析设计课题的要求,要求编程实现以下功能:(1)随机生成N个整数,存放到线性表中;(2)起泡排序并计算所需时间;(3)简单选择排序并计算时间;(4)希尔排序并计算时间;(5)直接插入排序并计算所需时间;(6)时间效率比较。
2、数据对象分析存储数据的线性表应为顺序存储。
三、数据结构设计使用顺序表实现,有关定义如下:typedef int Status;typedef int KeyType ; 直接插入排序0. 退出系统(二)程序模块结构由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):主控菜单项选择函数menu()创建排序表函数InitList_Sq()起泡排序函数Bubble_sort()简单选择排序函数SelectSort()希尔排序函数ShellSort();对顺序表L进行直接插入排序函数Insertsort()(三)函数调用关系程序的主要结构(函数调用关系)如下图所示。
其中main()是主函数,它负责调用各函数。
进行调用菜单函数menu(),根据选择项0~4调用相应的函数。
main()函数使for循环实现重复选择。
其循环结构如下:for (;;){long start,end;switch(menu()){case 1:printf("* 起泡排序*\n");start=clock();Bubble_sort(L);end=clock();printf("%d ms\n",end-start);fp=fopen("D: 起泡排序.txt","w");if(fp==NULL)xt","w");if(fp==NULL)xt","w");if(fp==NULL)Ney,[j].key)){flag=1; 共通过n-1趟,得到一个按排序码从小到大排列的有序序列流程图:NN代码描述:void SelectSort(SqList &L){ ] 中选择key最小的记录int k=i;for(int j=i+1;j<= ; j++)if ( LT[j].key,[k].key)) k=j;if(k!=i){x=[i];[i]=[j];[j]=x;}}} ey , [i-dk].key )){[0]= [i];int j;for(j=i-dk;(j>0)&&(LT [0].key , [j].key ));j-=dk)[j+dk]= [j];[j+dk]= [0];}}}void ShellSort(SqList &L,int dlta[],int t)NNey,[i-1].key)) ey,[j].key);j--){[j+1]=[j];ey的元素[j+1]=[0]; //将暂存在r[0]中的记录插入到正确位置}// printf("%d ",[i]);}算法的时间复杂度分析:O(n2)五、测试数据和结果1、测试数据随机产生30000个数2、测试结果本程序在VC++环境下实现,下面是对以上测试数据的运行结果。
数据结构课程设计(排序)
![数据结构课程设计(排序)](https://img.taocdn.com/s3/m/5e1872e87f1922791688e831.png)
数据结构课程设计[排序综合]学生姓名:学生学号:院(系):计算机科学与信息技术学院年级专业:指导教师:付丹丹二〇一一年十二月2- 3 - 3摘要数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非常重要的。
排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,其中包含冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序等,各有其特点。
对排序算法比较的分析可以遵循若干种不同的准则,通常以排序过程所需要的算法步数作为度量,有时也以排序过程中所作的键比较次数作为度量。
特别是当作一次键比较需要较长时间,例如,当键是较长的字符串时,常以键比较次数作为排序算法计算时间复杂性的度量。
当排序时需要移动记录,且记录都很大时,还应该考虑记录的移动次数。
究竟采用哪种度量方法比较合适要根据具体情况而定。
在下面的讨论中我们主要考虑用比较的次数作为复杂性的度量。
41概要1.1设计目的数据结构与算法课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构与算法是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。
综合排序-数据结构课程设计
![综合排序-数据结构课程设计](https://img.taocdn.com/s3/m/c3ab182e0912a216147929da.png)
《数据结构》课程设计排序目录1.课程设计的目的 (3)2.需求分析 (3)3.概要设计 (3)4.详细设计 (4)5.调试分析 (8)6.用户手册 (9)7.测试结果 (10)8.程序清单 (10)9.小结 (14)10.参考文献 (14)1.课程设计的目的1)、对数据结构基本理论和存储结构及算法设计有更加深入的理解;2)、掌握多种排序算法,尤其是奇偶排序算法(课堂上未学到的)3)、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;4)、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;2.需求分析利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
要求:至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、2-路插入排序、希尔排序、起泡排序、改进的冒泡排序、快速排序、选择排序、堆排序、归并排序、三部排序、计数排序、鸽巢排序、鸡尾酒排序、地精排序、奇偶排序、梳排序、耐心排序——标红的至少选择一种)。
并把排序后的结果保存在不同的文件中。
采用不同的函数来实现不同的排序算法,并需要一个菜单选择函数来实现排序功能的选择,并按照不同的排序算法将排好的数按不同的排序文件名存储在桌面上。
3.概要设计流程图如下所示:用srand((int)time(NULL))来提供随机数种子void menu()菜单选择函数void maopao(int [])冒泡排序void xuanze(int []) 选择排序void charu(int []) 插入排序void jiou(int []) 奇偶排序void display(int []) //打印排序号的数组4.详细设计(1)、void menu() //菜单选择{printf("***************** 欢迎使用排序系统******************\n\n");printf("** 1.冒泡排序***\n");printf("** 2.选择排序***\n");printf("** 3.插入排序***\n");printf("** 4.奇偶排序***\n ");printf("***************** 0.退出系统***********************\n\n");printf("请输入菜单选项\n");}(2)、void maopao(int a[N]) //冒泡排序{int i,j,temp;for (i=0;i<N-1;i++){for (j=N-1;j>i;j--) //比较,找出本趟最小关键字的记录if (a[j]<a[j-1]){temp=a[j]; //进行交换,将最小关键字记录前移a[j]=a[j-1];a[j-1]=temp;}}FILE *fp;if((fp=fopen("冒泡排序结果.txt","w"))==NULL){printf("文件打开失败\n");return;}for(i=0;i<N;i++)fprintf(fp,"%d ",a[i]);fclose(fp);}(3)、void xuanze(int a[N]) //选择排序{int i,j,k;for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(a[j]<a[k])k=j;if(k!=i){int temp;temp=a[k];a[k]=a[i];a[i]=temp;}}FILE *fp;if((fp=fopen("选择排序结果.txt","w"))==NULL) {printf("文件打开失败\n");exit(0);}for(i=0;i<N;i++)fprintf(fp,"%d ",a[i]);fclose(fp);}(4)、void charu(int a[N]) //插入排序{int i,j,temp;for(i=1;i<N;i++){temp=a[i];for(j=i;j>0&&a[j-1]>temp;j--)a[j]=a[j-1];a[j]=temp;}FILE *fp;if((fp=fopen("插入排序结果.txt","wb"))==NULL){printf("文件打开失败\n");return;}for(i=0;i<N;i++)fprintf(fp,"%d ",a[i]);fclose(fp);}(5)、void jiou(int a[N]) //奇偶排序{int i,temp;int flag;while(1){flag=0;for(i=0;i<N;i+=2)if(a[i]>a[i+1]){temp=a[i+1];a[i+1]=a[i];a[i]=temp;flag=1;}for(i=1;i<N;i+=2)if(a[i]>a[i+1]){temp=a[i+1];a[i+1]=a[i];a[i]=temp;flag=1;}if(flag==0){FILE *fp;if((fp=fopen("奇偶排序结果.txt","wb"))==NULL){printf("文件打开失败\n");return;}for(i=0;i<N;i++)fprintf(fp,"%d ",a[i]);fclose(fp);return;}}}(6)、void display(int a[N]) //打印排序号的数组{int i,j;for(i=0;i<N;i++){for(j=0;j<10;j++)printf("%d\t",a[i]);printf("\n");}}(7)主函数void main(){int i,j,m,a[N];srand((int)time(NULL));for(i=0;i<N;i++){a[i]=rand()%30000+1;}while(1){menu();scanf("%d",&m);switch(m){case 1: maopao(a);break;case 2: xuanze(a);break;case 3: charu(a);break;case 4: jiou(a);break;case 0: printf("谢谢使用!再见!\n");return;}display(a);}}5.调试分析(1)、冒泡排序(冒泡排序结果.txt保存在源程序的同一文件夹中)(2)、选择排序(选择排序结果.txt保存在源程序的同一文件夹中)(3)插入排序(插入排序结果.txt保存在源程序的同一文件夹中)(4)、奇偶排序(奇偶排序结果.txt保存在源程序的同一文件夹中)6.用户手册本程序在vc6.0上编译运行,用户可根据程序界面提示进行操作,如上面分析调试截图所示。
数据结构课程设计排序
![数据结构课程设计排序](https://img.taocdn.com/s3/m/f2ae4995dd88d0d233d46a43.png)
---《数据结构》课程设计报告内部排序算法研究指导老师:姓名:学号:班级:专业:日期:一、问题描述(1)设n个关键字均为整数(1≤n≤100000)(2)设计K个内部排序算法(K≥5),每个算法须记录执行所需的时间(3)自动生成多组数据,每组数据含n个整数 (正序、逆序、随机分布) (4)执行每个排序算法,统计各算法执行时间。
(5)用图、表格数据分析说明在什么情况下采用什么算法较好二、系统总体设计(模块结构图)(1)各函数功能说明Sortest类的成员函数功能说明void Qsort(int lw,int hi);快速排序函数void BubbleSort();;冒泡排序函数void ShellSort();希尔排序函数void HeapSort();堆排序函数void InsertSort();插入排序函数int partition(int lw,int hi);交换数组中[low]到a[high]的值,使枢轴记录到位,并返回其值,此时在之前的记录都不大于它,在它之后的记录都不小于它void Reload();对数据重新载入void Rand_Sort(int total);纪录cpu的运行周期数进而计算程序用时(2)模块结构图三、算法和数据结构设计程序主要部分为5种排序算法,数据用数组储存,程序运行时由用户输入数据个数,存入变量n,然后创建(n+1)个单位数据储存区储存数据,再由主函数分别调用顺序模块,逆序模块和随机模块,各个模块又分别调用对应的数据产生函数并分别调用5个排序函数,5个排序函数分别调用TheCycleCount()函数计算排序时间并打印输出,以上为程序的主体设计,各个排序算法的设计思想和伪代码见课本,不再赘述。
TheCycleCount()函数采用了嵌入汇编指令”RDTSC”的方法读取CPU自加电以来到调用该命令时所经过的时钟脉冲数。
这样,在排序前和排序后分别调用一次这个指令,将两者的差除以CPU的主频即可得到精确到纳秒级的时间了,精确度高。
数据结构课程设计实验报告(各种排序的实现与效率分析)
![数据结构课程设计实验报告(各种排序的实现与效率分析)](https://img.taocdn.com/s3/m/381a0c3887c24028915fc3a7.png)
数据结构课程设计实验报告1、需求分析(1)对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较;(2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标有:关键字参加比较次数和关键字的移动次数(关键字进行一次交换操作记为3次移动);(3)输出比较结果。
2、主要函数及数据类型typedef int KeyType; //定义关键字类型为整数类型typedef int InfoType; //定义关键字类型为整数类型typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef struct{KeyType key; //关键字项InfoType otherinfo; //其它数据项}RedType; //记录类型typedef struct {RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元int length; //顺序表长度}SqList; //顺序表类型3、源代码/*头文件和宏定义部分*/#include"string.h"#include"ctype.h"#include"time.h"#include"malloc.h" /* malloc()等*/#include"limits.h" /* INT_MAX等*/#include"stdio.h" /* EOF(=^Z或F6),NULL */#include"stdlib.h" /* atoi() */#include"io.h" /* eof() */#include"math.h" /* floor(),ceil(),abs() */#include"process.h" /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define MAXSIZE 100 //示例数据类型的最大长度typedef int KeyType; //定义关键字类型为整数类型typedef int InfoType; //定义关键字类型为整数类型typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef struct{KeyType key; //关键字项InfoType otherinfo; //其它数据项}RedType; //记录类型typedef struct {RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元int length; //顺序表长度}SqList; //顺序表类型void InitData(SqList *L,int dataCopy[]){int i;L->length=MAXSIZE;srand((unsigned)time(NULL));for(i=0;i<=MAXSIZE;i++){L->r[i].otherinfo=0;dataCopy[i]=L->r[i].key=rand();}}void PrintData(SqList L){int i;for(i=1;i<=L.length;i++){printf("%d\t",L.r[i].key);}}void ResumeData(SqList *L,int dataCopy[]){int i;for(i=0;i<=MAXSIZE;i++){L->r[i].key=dataCopy[i];}}void PrintStatistic(int *compareCounts,int *moveCounts){printf("\n\t\t各种排序方法比较结果:\n\n");printf("\t\t起泡排序: 比较次数%d,移动次数%d\n",compareCounts[0],moveCounts[0]);printf("\t\t直接插入排序:比较次数%d,移动次数%d\n",compareCounts[1],moveCounts[1]);printf("\t\t简单选择排序:比较次数%d,移动次数%d\n",compareCounts[2],moveCounts[2]);printf("\t\t快速排序: 比较次数%d,移动次数%d\n",compareCounts[3],moveCounts[3]);printf("\t\t希尔排序: 比较次数%d,移动次数%d\n",compareCounts[4],moveCounts[4]);printf("\t\t堆排序: 比较次数%d,移动次数%d\n",compareCounts[5],moveCounts[5]);}/*******************************直接插入排序*******************************/void InsertSort(SqList *L,int *compareCounts,int *moveCounts ) //直接插入排序{int i,j; //for(i=2;i<=L->length;i++) //从顺序表的第二个元素开始进行比较{if(L->r[i].key<L->r[i-1].key) //将每个元素与它的前一个元素关键字进行比较{L->r[0]=L->r[i]; //如果关键字比前一个元素关键字小,就将元素复制作为哨兵L->r[i]=L->r[i-1];(*moveCounts)+=2; //关键字移动了2次j=i-2; //从要比较的关键字的前第二个记录开始进行比较,然后后移while(L->r[0].key<L->r[j].key){L->r[j+1]=L->r[j]; //记录后移(*moveCounts)++; //每作一次后移,移动次数加1j--;(*compareCounts)++; //每作一次比较,比较次数加1}L->r[j+1]=L->r[0]; //插入到正确位置}(*compareCounts)++;}}/*******************************希尔排序*******************************/void ShellInsert(SqList *L,int increment,int *compareCounts,int *moveCounts){ //对顺序表作一趟希尔插入排序int j,n;for(j=1+increment;j<=L->length;j++){if(L->r[j].key<L->r[j-increment].key) //将L->[i]插入到有序增量子表{L->r[0]=L->r[j]; //暂存在L->r[0]L->r[j]=L->r[j-increment];(*moveCounts)+=2;for(n=j-2*increment;n>0&&L->r[0].key<L->r[n].key;n-=increment){L->r[n+increment]=L->r[n]; //记录后移,查找插入位置(*moveCounts)++;(*compareCounts)++;}L->r[n+increment]=L->r[0]; //插入(*moveCounts)++;}(*compareCounts)++;}}void ShellSort(SqList *L,int IncreList[],int times,int *compareCounts,int *moveCounts) //希尔排序{ //按增量序列Increlist[0.....times-1]对顺序表L作希尔排序int k; //for(k=0;k<times;k++){ShellInsert(L,IncreList[k],compareCounts,moveCounts); //一趟增量为IncreList[k]的插入排序}}/*******************************起泡排序*******************************/void BubbleSort(SqList *L,int *compareCounts,int *moveCounts) //起泡排序{int i,j;for(i=1;i<=L->length;i++){for(j=L->length;j>i;j--){ //从后往前两两进行比较,将元素关键字小的交换到前面if(L->r[j].key<L->r[j-1].key){L->r[0]=L->r[j];L->r[j]=L->r[j-1];L->r[j-1]=L->r[0];(*moveCounts)+=3;}(*compareCounts)++;}}}/*******************************快速排序*******************************/int Partition(SqList *L,int low,int high,int *compareCounts,int *moveCounts) //快速排序中的分{int pivotkey;L->r[0]=L->r[low];(*moveCounts)++;pivotkey=L->r[low].key;while(low<high){while(low<high&&L->r[high].key>=pivotkey){high--;(*compareCounts)++;}L->r[low]=L->r[high];(*moveCounts)++;while(low<high&&L->r[low].key<=pivotkey){low++;(*compareCounts)++;}L->r[high]=L->r[low];(*moveCounts)++;(*compareCounts)++;}L->r[low]=L->r[0];(*moveCounts)++;return low;}void QSort(SqList *L,int low,int high,int *compareCounts,int *moveCounts){int pivotloc;if(low<high){pivotloc=Partition(L,low,high,compareCounts,moveCounts);QSort(L,low,pivotloc-1,compareCounts,moveCounts);QSort(L,pivotloc+1,high,compareCounts,moveCounts);}}void QuickSort(SqList *L,int *compareCounts,int *moveCounts){QSort(L,1,L->length,compareCounts,moveCounts);}/*******************************简单选择排序*******************************/void SelectSort(SqList *L,int *compareCounts,int *moveCounts){int i,j,minPoint;for(i=1;i<=L->length;i++){L->r[0]=L->r[i];(*moveCounts)++;minPoint=i;for(j=i+1;j<=L->length;j++){if(L->r[j].key<L->r[0].key){L->r[0]=L->r[j];(*moveCounts)++;minPoint=j;}(*compareCounts)++;}L->r[minPoint]=L->r[i];L->r[i]=L->r[0];(*moveCounts)++;}}/*******************************堆排序*******************************/void HeapAdjust(SqList *L,int s,int m,int *compareCounts,int *moveCounts){RedType cmpKey; //待比较的值int j;cmpKey=L->r[s];(*moveCounts)++;for(j=s*2;j<=m;j*=2){(*compareCounts)+=2;if(j<m&&L->r[j].key<L->r[j+1].key) j++;if(!(cmpKey.key<L->r[j].key)) break;L->r[s]=L->r[j];(*moveCounts)++;s=j;}L->r[s]=cmpKey;(*moveCounts)++;}void HeapSort(SqList *L,int *compareCounts,int *moveCounts){int i;RedType temp;for(i=L->length/2;i>0;i--) HeapAdjust(L,i,L->length,compareCounts,moveCounts);for(i=L->length;i>1;i--){temp=L->r[1];L->r[1]=L->r[i];L->r[i]=temp;(*moveCounts)+=3;HeapAdjust(L,1,i-1,compareCounts,moveCounts);}}void SortCompare(){SqList L; //用顺序表存放待排序的元素int dataCopy[MAXSIZE+1],i;int compareCounts[7],moveCounts[7];int increList[6];for(i=0;i<5;i++){increList[i]=(int)pow(2,7-i)-1;}increList[5]=1;for(i=0;i<7;i++){compareCounts[i]=0;moveCounts[i]=0;}InitData(&L,dataCopy); //初始化数据,随机产生100个正整数的数列printf("\t\t\t初始化数据后产生的数列:\n");PrintData(L); //显示出未排序的数列printf("\n\n\t\t\t经过起泡排序后产生的数列:\n");BubbleSort(&L,&compareCounts[0],&moveCounts[0]); //对数列使用起泡排序PrintData(L); //显示出排序好的数列ResumeData(&L,dataCopy);printf("\n\n\t\t\t经过直接插入排序后产生的数列:\n");InsertSort(&L,&compareCounts[1],&moveCounts[1]); //对数列使用插入排序PrintData(L); //显示出排序好的数列ResumeData(&L,dataCopy);printf("\n\n\t\t\t经过简单选择排序后产生的数列:\n");SelectSort(&L,&compareCounts[2],&moveCounts[2]); //对数列使用简单选择排序PrintData(L); //显示出排序好的数列ResumeData(&L,dataCopy);printf("\n\n\t\t\t经过快速排序后产生的数列:\n");QuickSort(&L,&compareCounts[3],&moveCounts[3]); //对数列使用快速排序PrintData(L); //显示出排序好的数列ResumeData(&L,dataCopy);printf("\n\n\t\t\t经过希尔排序后产生的数列:\n");ShellSort(&L,increList,6,&compareCounts[4],&moveCounts[4]); //对数列使用希尔排序PrintData(L); //显示出排序好的数列ResumeData(&L,dataCopy);printf("\n\n\t\t\t经过堆排序后产生的数列:\n");HeapSort(&L,&compareCounts[5],&moveCounts[5]); //对数列使用堆排序PrintData(L); //显示出排序好的数列PrintStatistic(compareCounts,moveCounts);}main(){int i,temp;for(i=0;i<5;i++){SortCompare();printf("\n\t\t请按任意键进行下一组数据的排序对比\n\n");temp=getchar();}}4、调试分析成功运行,如图所示:。
排序综合数据结构课程设计论文
![排序综合数据结构课程设计论文](https://img.taocdn.com/s3/m/f6807fc1bb4cf7ec4afed0bc.png)
天津职业技术师范大学课程设计任务书理学院数学0902 班学生(16)马新月课程设计课题:16、综合排序:利用随机函数随机产生N=200个随机整数,对这些数进行多种方法的排序。
要求:1)至少采用三种方法实现上述问题求解(插入排序、希尔排序、冒泡排序、快速排序、堆排序、归并排序)。
把排序后的结果存在不同的文件中。
2)记录不同排序方法的运行时间,找出自己排序方法中最快的两种方法。
3)统计每种算法所用的比较次数和交换次数,以列表显示出来。
一、课程设计工作日自 2012 年 2 月 21 日至 2012 年3 月4 日二、同组学生:马新月三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):课题来源:教师提供课题类型:设计课程设计的目的1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力天津职业技术师范大学课程设计评审表学院班学生1概要1.1设计目的数据结构与算法课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构与算法是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
1)本演示程序对以下6种常用的内部排序算法进行实测比较:冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序;2)待排序表的元素的关键字为整数。
比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动);3)演示程序以以用户和计算机的对话方式执行,在计算机终端上显示提示信息,对随机数组进行排序,并输出比较指标值;4)最后对结果作出简单分析。
数据结构__排序综合报告
![数据结构__排序综合报告](https://img.taocdn.com/s3/m/ed278e966bec0975f465e26c.png)
数学与计算机学院课程设计说明书课程名称: 数据结构-课程设计课程代码: 8404181题目: 排序综合年级/专业/班: 2009级软件工程四班学生姓名: 学号: 开始时间: 2011 年 06 月 20 日完成时间: 2011 年 07 月 03 日课程设计成绩:指导教师签名:年月摘要排序(sorting)是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。
由于待排序的记录数量不同,使得排序过程中涉及的存储器的不同,可将排序方法分为两大类:一类是内部排序,指的是待排序的记录存放在计算机随机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需要对外存进行访问的排序过程。
内部排序又分为:插入排序、快速排序、选择排序、归并排序和基数排序。
其中插入排序又分为:直接插入排序、其他插入排序和希尔排序;选择排序分为:简单选择排序、树形选择排序和堆排序;基数排序分为:多关键字排序和链式基数排序。
本次课程设计就是内部排序中的几个常用排序方法。
分析了排序的实质,排序的应用,排序的分类,利用C语言采用数组存储结构编程实现了本排序综合系统,该系统包含了几种常见的排序方法,有直接插入排序、希尔排序、冒泡排序、非递归的快速排序、递归的快速排序、简单排序、堆排序。
关键字:内部排序,外部排序,排序,重新排列,关键字目录1需求分析 (1)1.1任务与分析 (1)1.2功能模块的划分 (1)1.2.1 输入模块 (1)1.2.2 选择排序方法模块 (1)1.2.3 输出模块 (1)1.3排序模块分析 (2)1.3.1 直接插入排序 (2)1.3.2 希尔排序 (2)1.3.3 冒泡排序 (2)1.3.4 快速排序(递归和非递归) (2)1.3.5 简单排序 (3)1.3.6 堆排序 (3)1.4系统需求分析规格说明书 (3)2开发及运行平台 (4)2.1 WINDOWS操作系统 (4)2.2VC++6.0 (4)3 概要设计 (4)3.1程序结构框图 (4)3.2程序流程图 (5)3.3抽象数据类型定义 (5)3.4各种操作函数: (6)3.5主函数 (6)4 详细设计 (7)4.1数据类型定义 (7)4.2主要模块内部设计 (7)4.2.1 模块1 —直接插入排序模块设计 (7)4.2.2 模块2 —希尔排序模块设计 (7)4.2.3 模块3 —冒泡排序模块设计 (8)4.2.4 模块4 —非递归快排模块设计 (9)4.2.5 模块5 —递归快排模块设计 (10)4.2.6 模块6 —简单排序模块设计 (10)4.2.7 模块7 —堆排序模块设计 (10)5 调试分析 (12)5.1调试过程 (12)5.2性能分析 (12)6 测试分析 (13)6.1测试用例 (13)6.2测试结果 (13)7 结论 (15)参考文献 (16)附录 (17)1需求分析1.1 任务与分析任务:机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.XX职业技术师X大学课程设计任务书理学院数学0902班学生(16)马新月课程设计课题:16、综合排序:利用随机函数随机产生N=200个随机整数,对这些数进行多种方法的排序。
要求:1)至少采用三种方法实现上述问题求解(插入排序、希尔排序、冒泡排序、快速排序、堆排序、归并排序)。
把排序后的结果存在不同的文件中。
2)记录不同排序方法的运行时间,找出自己排序方法中最快的两种方法。
3)统计每种算法所用的比较次数和交换次数,以列表显示出来。
一、课程设计工作日自2012 年2月21日至2012年3月4日二、同组学生:马新月三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):课题来源:教师提供课题类型:设计课程设计的目的1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规X化软件设计的能力。
3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力XX职业技术师X大学课程设计评审表学院班学生1概要1.1设计目的数据结构与算法课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构与算法是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
1)本演示程序对以下6种常用的内部排序算法进行实测比较:冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序;2)待排序表的元素的关键字为整数。
比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动);3)演示程序以以用户和计算机的对话方式执行,在计算机终端上显示提示信息,对随机数组进行排序,并输出比较指标值;4)最后对结果作出简单分析。
1.2预期目标按要求输入不同的操作。
输入后,根据不同的输入进行不同的操作,最终达到对各算法进行比较的目的。
通过此次课程设计主要达到以下目的了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规X进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2排序算法2.1各排序算法的特点1)冒泡排序冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。
即首先比较第1个和第2个数,将大数放前,小数放后。
然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。
重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。
如此下去,直至最终完成排序。
由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。
2)直接插入排序每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中;第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
3)简单选择排序(1)在一组元素V[i]~V[n-1]中选择具有最小排序码的元素(2)若它不是这组元素中的第个元素,则将它与这一组元素中的第一个元素对调;(3)在这组元素中剔除这个具有最小排序码的元素,在剩下的元素V[i+1]~V[n-1]中重复执行第(1)(2)步,直到剩余元素只有一个为止。
4)快速排序首先检查数据列表中的数据数,如果小于两个,则直接退出程序。
如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序;5)希尔排序先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止;6) 堆排序堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素;堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2]);2.2各算法的比较方法1.稳定性比较插入排序、冒泡排序、简单选择排序及其他线形排序是稳定的希尔排序、快速排序、堆排序是不稳定的2.时间复杂性比较插入排序、冒泡排序、选择排序的时间复杂性为O(n2)其它非线形排序的时间复杂性为O(nlog2n)线形排序的时间复杂性为O(n);3.辅助空间的比较线形排序的辅助空间为O(n),其它排序的辅助空间为O(1);4.其它比较插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。
反而在这种情况下,快速排序反而慢了。
当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
若待排序的记录的关键字在一个明显有限X围内时,且空间允许是用桶排序。
当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下,宜用归并排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序3流程图及详细算法3.1流程图函数的调用关系图反映了演示程序的层次结构:图3.1 流程图3.2流程图模块说明1)Main为主函数模块2)bubblesort,insertsort,selectsort,quicksort,shellsort,heansort分别对应冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序的各函数模块3)在初始化数据之后,选择对应的排序模块进行排序,并对排序做出比较3.3可排序表的抽象数据类型定义:typedef struct{ //定义一个RedType型结构体,存放关键字int key; //关键字为整型} RedType;class LinkList //定义一个顺序表{public:RedType r[MAXSIZE+1]; //长度为MAXSIZE+1的数组r,数组里每个元素均为RedTypeint Length; //数组长度int CmpNum, ChgNum; //关键字的比较次数,移动次数LinkList(); //构造函数bool LT(int i, int j); //比较i和j的大小void Display(); //输出数组元素void Insert( int dk); //插入排序void ShellSort(); //希尔排序int Partition( int low, int high); //比基准小的数放左边,比起大的数放右边,返回基准位置void QSort( int low, int high); //从low到high位置进行快速排序void QuickSort(); //对有序表进行快速排序void HeapAdjust( int s, int m); //将无序堆调整为大顶堆void HeapSort(); //堆排序,将大顶堆转换为小顶堆void BubbleSort(); //冒泡排序int SelectMinKey( int k); //找到数组中最小值,返回最小值位置void SelSort(); //对顺序表进行选择排序void SelectSort(); //界面设计void AllAbove(); //统计以上所有排序关键字的比较次数、移动次数及所消耗的时间};3.4程序代码3.4.1 函数声明#include <stdio.h>#include <iostream.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <windows.h>#include <winbase.h>#include <iomanip.h>#define MAXSIZE 1000#define TRUE 1#define FALSE 0typedef int BOOL;typedef struct{int key;} RedType;class LinkList{public:RedType r[MAXSIZE+1];int Length;int CmpNum, ChgNum; LinkList();bool LT(int i, int j);void Display();void Insert( int dk);void ShellSort();int Partition( int low, int high); void QSort( int low, int high); void QuickSort();void HeapAdjust( int s, int m); void HeapSort();void BubbleSort();int SelectMinKey( int k);void SelSort();void SelectSort();void AllAbove();};LinkList::LinkList(){int i;for (i = 0; i <= MAXSIZE; i++)r[i].key = rand()%1000; Length=MAXSIZE+1; CmpNum=0;ChgNum=0;}bool LinkList::LT(int i, int j){ (CmpNum)++;if (i < j)return TRUE;elsereturn FALSE;}void LinkList::Display(){int j;for(int i=0;i<=MAXSIZE;i++){cout<<setw(6)<<r[i].key;if(++j%10==0)cout<<endl;}cout<<endl;}4.3.2六种排序算法代码//插入排序void LinkList::Insert(int dk){int i, j;RedType Temp;for (i = dk; i < Length; i++){if (LT(r[i].key, r[i - dk].key)){memcpy(&Temp, &r[i], sizeof(RedType));for (j = i - dk; j >= 0 && LT(Temp.key, r[j].key); j -= dk){(ChgNum)++;memcpy(&r[j + dk], &r[j], sizeof(RedType));}memcpy(&r[j + dk], &Temp, sizeof(RedType));}}}//希尔排序void LinkList::ShellSort(){int t=Length+1;do{t=t/3+1;Insert( t);}while(t>1);}//快速排序int LinkList::Partition(int low, int high){RedType Temp;int PivotKey;memcpy(&Temp, &r[low], sizeof(RedType));PivotKey = r[low].key;while (low < high){while (low < high &&r[high].key >= PivotKey){high--;(CmpNum)++;}(ChgNum)++;memcpy(&r[low], &r[high], sizeof(RedType));while (low < high && r[low].key <= PivotKey){low++;(CmpNum)++;}(ChgNum)++;}memcpy(&r[low], &Temp, sizeof(RedType)); return low;}void LinkList::QSort( int low, int high){int PivotLoc = 0;if (low < high){PivotLoc = Partition( low, high);QSort(low, PivotLoc - 1);QSort( PivotLoc + 1, high);}}void LinkList::QuickSort(){QSort(0, Length - 1);}//堆排序void LinkList::HeapAdjust(int s, int m){RedType Temp;int j = 0;s++;memcpy(&Temp, &r[s - 1], sizeof(RedType)); for (j = 2 * s; j <= m; j *= 2){if (j < m && LT(r[j - 1].key, r[j].key))++j;if (!LT(Temp.key, r[j - 1].key))break;(ChgNum)++;memcpy(&r[s - 1], &r[j - 1], sizeof(RedType));s = j;}memcpy(&r[s - 1], &Temp, sizeof(RedType));}void LinkList::HeapSort(){int i = 0;RedType Temp;for (i = Length / 2-1; i >= 0; i--)HeapAdjust(i, Length);for (i = Length; i > 1; i--){memcpy(&Temp, &r[0], sizeof(RedType));(ChgNum)++;memcpy(&r[0], &r[i - 1], sizeof(RedType));HeapAdjust( 0, i - 1);}}//冒泡排序void LinkList::BubbleSort(){int i, j;RedType temp;for (i = 1; i <= MAXSIZE; i++){for (j = 1; j <= MAXSIZE - i; j++){if (!LT(r[j].key, r[j + 1].key)){(ChgNum)++;memcpy(&temp, &r[j], sizeof(RedType));memcpy(&r[j], &r[j + 1], sizeof(RedType));memcpy(&r[j + 1], &temp, sizeof(RedType));}}}}//选择排序int LinkList::SelectMinKey( int i){int Min = i;for (int k=i; k < Length; k++){if (!LT(r[Min].key, r[k].key))Min = k;}return Min;}void LinkList::SelSort(){int i, j;RedType temp;for (i = 0; i < Length; i++){j = SelectMinKey( i);if (i != j){(ChgNum)++;memcpy(&temp, &r[i], sizeof(RedType));memcpy(&r[i], &r[j], sizeof(RedType));memcpy(&r[j], &temp, sizeof(RedType));}}}4.3.3 排序算法的选择void LinkList::SelectSort(){cout<<"1. 插入排序"<<endl;cout<<"2. 希尔排序"<<endl;cout<<"3. 快速排序"<<endl;cout<<"4. 堆排序"<<endl;cout<<"5. 冒泡排序"<<endl;cout<<"6. 选择排序"<<endl;cout<<"7. 以上各种排序"<<endl;cout<<"8. 退出程序"<<endl;cout<<"请选择需要进行的操作:"<<endl;}void LinkList::AllAbove(){int TempTime;int SpendTime;cout<<endl;LinkList();cout<<"插入排序:"<<endl;TempTime = (int)GetTickCount();Insert( 1);SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;LinkList();//随机数列复位cout<<endl;cout<<"希尔排序:"<<endl;TempTime = (int)GetTickCount();ShellSort();SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;LinkList(); //随机数列复位cout<<endl;cout<<"快速排序:"<<endl;TempTime = (int)GetTickCount();QuickSort();SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;LinkList(); //随机数列复位cout<<endl;cout<<"堆排序:"<<endl;TempTime = (int)GetTickCount();HeapSort();SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;LinkList(); //随机数列复位cout<<endl;cout<<"冒泡排序:"<<endl;TempTime = (int)GetTickCount();BubbleSort();SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;LinkList(); //随机数列复位cout<<endl;cout<<"选择排序:"<<endl;TempTime = (int)GetTickCount();SelSort();SpendTime = (int)GetTickCount() - TempTime;cout<<endl;cout<<"pareNumber="<<CmpNum<<" "<<"ChageNumber="<<ChgNum<<" "<<"TimeSpent="<<SpendTime<<"ms"<<endl;}4.3.4主函数程序代码void main(){int i,j;int select = 0;int SpendTime = 0;int TempTime;do{LinkList L;L.SelectSort();cin>>select;switch (select){case 1:cout<<"插入排序前:"<<endl;L.Display();cout<<"插入排序后:"<<endl;TempTime = (int)GetTickCount();L.Insert(1);SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 2:cout<<"希尔排序前:"<<endl;L.Display();cout<<"希尔排序后:"<<endl;cout<<endl;TempTime = (int)GetTickCount();L.ShellSort();SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 3:cout<<"快速排序前:"<<endl;L.Display();cout<<"快速排序后:"<<endl;TempTime = (int)GetTickCount();L.QuickSort();SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 4:cout<<"堆排序前:"<<endl;L.Display();cout<<"堆排序后:"<<endl;TempTime = (int)GetTickCount();L.HeapSort();SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 5:cout<<"冒泡排序前:"<<endl;L.Display();cout<<"冒泡排序后:"<<endl;TempTime = (int)GetTickCount();L.BubbleSort();SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 6:cout<<"选择排序前:"<<endl;L.Display();cout<<"选择排序后:"<<endl;TempTime = (int)GetTickCount();L.SelSort();SpendTime = (int)GetTickCount() - TempTime;L.Display();cout<<endl;cout<<"比较次数="<<L.CmpNum<<" "<<"关键字移动次数="<<L.ChgNum<<" "<<"所需时间="<<SpendTime<<"ms"<<endl;break;case 7:L.AllAbove();break;default:cout<<"please input numbers again"<<endl;break;}}while(select!=8);}4运行结果4.1调试分析1.对正序、逆序和若干不同程度随机打乱的可排序表,进行各种排序方法的比较测试,得到的测试数据具有较好的典型性和可比较性。