C语言课程设计说明书-排序算法系统设计 .doc

上传人:韩长文 文档编号:5089755 上传时间:2020-02-01 格式:DOC 页数:18 大小:216KB
返回 下载 相关 举报
C语言课程设计说明书-排序算法系统设计 .doc_第1页
第1页 / 共18页
C语言课程设计说明书-排序算法系统设计 .doc_第2页
第2页 / 共18页
C语言课程设计说明书-排序算法系统设计 .doc_第3页
第3页 / 共18页
C语言课程设计说明书-排序算法系统设计 .doc_第4页
第4页 / 共18页
C语言课程设计说明书-排序算法系统设计 .doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《C语言课程设计说明书-排序算法系统设计 .doc》由会员分享,可在线阅读,更多相关《C语言课程设计说明书-排序算法系统设计 .doc(18页珍藏版)》请在三一文库上搜索。

1、课程设计说明书摘 要C是一种通用的程序设计语言,C语言在很多方面继承和发展了以往许多高级程序设计语言的成功经验和特色,具有书写格式自由、数据类型丰富、语句功能强大、执行速度快和存储控制能力强等优点。排序算法系统设计是关于顺序表排序算法来设计的一个系统。整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成顺序表排序算法的全过程,包括直接插入排序、二分法插入排序、直接选择排序、冒泡排序、两路冒泡排序、分块归并排序、归并排序以及重新生成随机数组。本课程主要介绍了本课题的开发背景,所要完成的功能和开发的过程。重点说明了系统的设计思路、总体设计、各个功能模块的设计与实现方法。关键词:排序算

2、法系统,C语言,数据结构,CFreeV5.0目录1课题背景的介绍11.1 课题背景11.2 目的12需求分析22.1 数据需求分析22.2 功能需求分析23系统总体设计33.1 系统模块划分33.2 系统模块结构图34系统详细设计44.1 系统主界面设计44.2初始化学生信息44.3查找学生信息44.4删除学生信息54.5更新学生信息54.6排序74.7统计学生信息114.8插入学生信息115系统连编与运行126总 结13参考文献14第 2 页 共 18 页1 课题背景的介绍1.1 课题背景算法是程序的核心,对数据进行排序是各种管理系统中不可缺少的一部分,大量的数据进行排序处理,算法的好坏决定

3、着程序的执行效率以及用户的使用感受,而作为最为常用的顺序表存储结构排序,我们针对其设计了一个排序算法系统,并将归并排序和冒泡排序进行优化设计,这也是我们研究这个课程的目的。为了能够更好的来实现对顺序表结构的数据排序,通过对日常工作的详细调查,搜集了大量的资料,从系统结构的组织,功能的实现,技术的要求以及可行性等多方面进行考虑,认为本课题是一个适应现今排序算法需求的计算机排序算法系统,具有一定的实际开发价值和使用价值。1.2 目的本课题运用C语言进行开发,C语言能够简单的进行编译一些程序,来实现对一些问题的解决。它虽然比较简单的处理一些问题,但却有更高的效率。它能够被大多数用户所接受,因为它能够

4、呈现出清晰的界面,是人们能够很好的理解。能在一些方面给人们更好的服务,成为人们的好帮手。经过这一个学期对数据结构的学习,我们都学到了不少东西,可能有些学的还不够理想,但无论如何这些知识都为我们的下一步学习打下了坚实的基础。做这么一个课程设计,一方面是为了检查我们一个学期以来的学习成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。2 需求分析随着日常处理数据规模的不断扩大,程序向着大型化,规模化发展,而对于数据排序效率的要求不断提高。在这种情况下单靠人工来处理信息不但显得大不从心,而且极容易出错。因此,需要开发排序算法系统,该系统可以实现

5、由计算机代替人工执行一系列复杂而繁琐的排序操作,使得程序设计人员可以轻松快捷的完成对各种数据的排序管理的任务。2.1 数据需求分析本系统的主要数据是顺序表数组。为了有更好的排序算法展示效果,数组的数据由单独的随机数组生成函数创建。2.2 功能需求分析本系统主要实现对数据的各种排序算法,需要实现以下几个方面的功能:(1)直接插入排序(2)二分法插入排序(3)直接选择排序(4)冒泡排序(5)两路冒泡排序(6)分块归并排序(7)归并排序(8)重新生成随机数组3 系统总体设计3.1 系统模块划分本系统主要是对数据的排序算法,包括了排序算法有:直接插入排序,二分法插入排序,直接选择排序,冒泡排序,两路冒

6、泡排序,分块归并排序,归并排序。整个系统分为以下几个模块。1、菜单模块 本模块实现菜单列表,通过用户选择列表调用相关函数实现功能。2、排序算法模块本模块用于实现对数据的各种排序算法。其中包括:1、直接插入排序2、二分法插入排序3、直接选择排序4、冒泡排序排序5、两路冒泡排序6、分块归并排序7、归并排序3.2系统模块结构图根据排序算法系统功能设计,对应的系统模块结构图如图3.2.1所示:图3.2.1 系统模块结构图冒泡排序归并排序法分块归并排序两路冒泡排序两路冒泡排序二分法排序直接插入法直接选择法退出各种排序算法重新生成数组程序菜单4 系统详细设计4.1 系统主界面设计统过对该系统设计的了解与讨

7、论,同时也为了广大使用者的方便与快捷。我们最后设计了这样的一个界面。首先要让使用者明白怎样使用此系统。这就需要通过界面来给他们一个清晰而明白的空间。而我们设计的这个界面恰好符合了这一要求。通过调用界面函数来使使用者能够很方便的进行各种排序算法的操作。doputLOGO();printf( 1直接插入排序n);printf( 2二分法插入排序n);printf( 3直接选择排序n);printf( 4冒泡排序n);printf( 5两路冒泡排序n);printf( 6分块归并排序 n);printf( 7归并排序n);printf( 8重新生成随机数组n);printf( 9退出n);print

8、f(n 请用键盘选择:);Key=UserChoice(123456789); /提高运行效率 确保每一次循环都有效if(Key != 9)CLS;switch(Key)case 1:/直接插入排序 tmp = straitsort(L); OutputSqList(tmp); break;case 2:/二分法插入排序 tmp = bisort(L); OutputSqList(tmp); break;case 3:/直接选择排序 tmp = directbisort(L); OutputSqList(tmp); break; case 4:/冒泡排序 tmp = maopaobisort(

9、L); OutputSqList(tmp); break; case 5:/两路冒泡排序 tmp = TwinBubbleSort(L); OutputSqList(tmp); break; case 6:/分块归并排序 tmp = L; ShowMergerListPlus(L, S); break; case 7:/归并排序 tmp = L; MergeSort(tmp); OutputSqList(tmp); break; case 8:/重新生成随机数组 CreateSqList(L);/创建随机数数组 OutputSqList(L); break;if(Key != 9)PAUSE;

10、while(Key!=9);4.2创建部分有序随机数组为排序算法创建随机数组。void CreateSqList(SqList &L)SqList tmp;L = tmp;int iRand;/随机数 int rndLength;/随机有序数个数 printf(请输入数组长度:); do scanf(%d, &L.length); if (L.length MAXSIZE) printf(输入有误!请重新输入n); while (L.length MAXSIZE); srand(unsigned)time(NULL);/初始化随机数 for(int i=0; i= L.length)/检查生成

11、随机数数量是否超过要求数量 rndLength = L.length - i; printf(n%d个随机数 已生成%d个:, rndLength,i); for(int j=0; jsta = -1; p-end = -1;/ -1 + 1 = 0 即为初个分组起始下标 for(i=0; i L.datai)/*找到位置!(当前数小于tmp)*/ r = (SpScope *)malloc(sizeof(SpScope) r-sta = p-end + 1;r-end = i - 1;p-next = r; p = r; tmp = L.datai; r = (SpScope *)mallo

12、c(sizeof(SpScope);/补上末尾最后一组元素 r-sta = p-end + 1;r-end = i - 1; p-next = r; p = r; p-next = NULL;/*合并两个数组块*/void MergerList(SqList &L, SpScope *S1, SpScope *S2)int *temp;/临时存储排序后的合并数组 int p=0;/p为temp数组下标 int i=S1-sta;int j=S2-sta;temp = (int *)malloc(S2-end - S1-sta + 1)*sizeof(int); while(iend & jen

13、d)/块比较后取数 if(L.datai L.dataj)tempp = L.datai;i+;elsetempp = L.dataj;j+;p+;if(i end)/剩余部分直接插入temp数组末尾 while(i end)tempp = L.datai;i+;p+;else if(j != S2-end)while(j end)tempp = L.dataj;j+;p+;for(int i=0,j=S1-sta; p0; p-,i+,j+)/用temp数组覆盖原数组 L.dataj = tempi;/*合并所有数组块*/ void MergerListAll(SqList &L, SpSc

14、ope S)SpScope *S1, *S2, *p;S1 = S.next;S2 = S1-next;int i=1;while(S.next-next != NULL)/只要分割表内有两个以上元素就继续循环 printf(nn%d-%d %d-%d, S1-sta,S1-end, S2-sta,S2-end);MergerList(L, S1, S2);/合并块 p = S2;/分割表合并 S1-end = S2-end;S1-next = S2-next;S1 = S1-next;/将指针指向下两个元素if(S1 != NULL)/若S1为NULL,则访问S1-next将会出错! S2

15、= S1-next;elseS2 = NULL;free(p);if(S2 = NULL)/组合已到末尾 重头继续开始合并 S1 = S.next;S2 = S1-next;printf(n*第%d次合并*, i+);OutputList(L);4.4两路冒泡排序 本算法是对冒泡排序算法的改进算法。/*两路冒泡排序*/SqList TwinBubbleSort(SqList L) int i,j,k,l;int exchangeMAX, exchangeMIN;/是否发生交换标记 int tmp;/交换临时变量 for(i=0; iL.length-1; i+) /冒泡出一个最大数 excha

16、ngeMAX = 0; j = i; while(j L.dataj+1)/找到位置! 交换(找最大) exchangeMAX = 1; tmp = L.dataj; L.dataj = L.dataj+1; L.dataj+1 = tmp; j+; if(exchangeMAX = 0) return L; /冒泡出一个最小数 exchangeMIN = 0; k = i;/起始下标 l = L.length-1-i-1;while(k l)if(L.datal L.datal-1)/找到位置! 交换(找最小) exchangeMIN = 1; tmp = L.datal; L.datal

17、= L.datal-1; L.datal-1 = tmp; l-;if(exchangeMIN = 0) return L; /输出结果 printf(n); for(int p=0; pL.length; p+) printf(%d , L.datap); printf(n); return L;4.5直接插入排序/*直接插入排序*/SqList straitsort(SqList L) int i,j,x; for(i=1; i-1)&(L.datajx) L.dataj+1=L.dataj; j-; L.dataj+1=x; return L;4.6二分法插入排序/*二分法插入排序*/S

18、qList bisort(SqList L) int i,low,high,mid,x,k; for(i=1; i=L.length-1; i+) x=L.datai; low=0; high=i-1; while(lowx) high=mid-1; else low=mid+1; for(k=i-1; k=low; k-) L.datak+1= L.datak; L.datahigh+1=x; return L;4.7直接选择排序/*直接选择排序*/SqList directbisort(SqList L) int i,k,j,x; for(i=0; i=L.length-2; i+) k=

19、i; for(j=i+1; jL.dataj) k=j; if(k!=i) x=L.datak; L.datak=L.datai; L.datai=x; return L;4.8冒泡排序/*冒泡排序*/SqList maopaobisort(SqList L) int i,j,k,flag; for(i=0; i=L.length-2; i+) flag=0; j=0; while(j=L.dataj+1) flag=1; k=L.dataj; L.dataj=L.dataj+1; L.dataj+1=k; j+; if (flag=0) return L; return L;4.9归并排序/

20、*归并排序*/void Merge(SqList &L, int low, int mid, int high)int *temp;/临时存储排序后的合并数组 int i=low, j=mid+1, k=0;temp = (int *)malloc(high - low + 1)*sizeof(int);/动态分配数组空间 while(i=mid & j=high)if(L.datai L.dataj)tempk = L.datai;i+;k+;elsetempk = L.dataj;j+;k+;while(i = mid)tempk = L.datai;i+;k+;while(j = hig

21、h)tempk = L.dataj;j+;k+;for(k=0,i=low; i=high; k+,i+)/用temp数组覆盖原数组 L.datai = tempk;void MergePass(SqList &L, int length, int n)int i;for(i=0; i+2*length-1n; i=i+2*length)Merge(L,i,i+length-1,i+2*length-1);if(i+length-1 n)Merge(L,i,i+length-1,n-1); void MergeSort(SqList &L)int length;for(length=1;len

22、gthL.length;length=2*length)MergePass(L,length,L.length);5 系统连编与运行一个应用系统设计和创建完成后,还必须进行连编,以便生成一个可执行文件供最终用户使用。连编完成后还要运行,以检查整个系统的完整性和准确性,同时还可增加程序代码的保密性。(1)进行编译,如图所示:图表 51 编译程序图按图中所示运行程序,生成可执行文件.exe格式的文件。启动程序,首先设置排序数组长度图表 52设置数组长度图进入菜单界面图表 53 菜单界面图选择其中任意一种排序算法,例如摁键盘【1】键,调用直接排序算法对数组进行排序,系统将排序结果进行输出显示图表 5

23、4 输出结果图若希望重新生成随即数组,在菜单界面选择【8】,即可重新生成数组图表 55 重新生成数组图6 总 结本设计开发的工资管理系统从最后的测试结果来看,基本上实现了排序算法系统的几大功能:直接插入排序,二分法插入排序,直接选择排序,冒泡排序,两路冒泡排序,分块归并排序,归并排序等。并达到操作过程中的直观、方便、实用、安全等要求。系统采用模块化程序设计的方法,既便于系统功能的组合和修改,又便于未参与系统开发的技术维护人员补充和维护。本系统经过测试,证明其运行是稳定、可靠的。但在系统设计中也也遇到很多的问题,并且本系统的功能还需要不断的完善和改进,在以后空闲时间里逐一进行完善,使系统功能更加完善,使本软件能够更好的为大中型企业服务,创造更大的社会价值。在这次设计过程中,我得到了孔繁民老师的精心指导,在此,我由衷地感谢孔老师!参考文献1 谭浩强.C程序设计M.北京:清华大学出版社. 2005.2 严蔚敏. 数据结构(C语言版) M. 北京:清华大学出版社. 2008.3 陈雁.数据结构 M.北京:高等教育出版社,2004. 4 张磊.C程序设计教程.北京:中国铁道出版社.2007.5 李春葆.数据结构教程.北京:中国人民大学出版社.2009. 6 凯尼格.C陷阱与缺陷.北京:人民邮电出版社.2008. 第 16 页 共 18 页

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 绩效管理


经营许可证编号:宁ICP备18001539号-1