C语言排列组合课程设计.docx
- 文档编号:9546193
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:22
- 大小:157.56KB
C语言排列组合课程设计.docx
《C语言排列组合课程设计.docx》由会员分享,可在线阅读,更多相关《C语言排列组合课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
C语言排列组合课程设计
课程设计
课程设计名称:
排序综合
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
计算机应用技术专业课程设计任务书
学生姓名
专业班级
学号
题目
排序综合
课题性质
A
课题来源
D
指导教师
同组姓名
无
主要内容
运用C语言的知识对程序进行模块化设计;
运用数据结构的知识分别对七种排序方法进行设计;
采用菜单式对排序结果进行输出;
任务要求
综合运用这一年来所学的C语言知识与数据结构的知识对所选的课题进行详细的设计,任务分为9个模块进行设计分别为:
插入排序函数、冒泡排序函数、快速排序函数、选择排序函数、希尔排序函数、归并排序函数、堆排序函数以及选择函数与主函数。
参考文献
《数据结构(C语言版)》严蔚敏清华大学出版社
《C语言程序设计》(第三版)谭浩强清华大学出版社
《数据结构教程》(C语言版)西安电子科技大学
《数据结构教程》上机实验指导清华大学出版社
审查意见
指导教师签字:
教研室主任签字:
2014年6月15日
目录
1、需求分析:
4
2、概要设计4
3、运行环境5
1)、软件环境5
2)、硬件环境5
4开发工具和编程语言5
5详细设计5
6调试分析12
7测试结果12
一、测试方法:
12
二、测试结果:
12
参考文献15
心得体会16
1、需求分析:
排序综合问题,用数据结构的思想对一些数字进行排序,实现以下排序功能:
1、插入排序
2、冒泡排序
3、快速排序
4、选择排序
5、希尔排序
6、归并排序
7、堆排序
2、概要设计
1、程序总体框架图如下:
2、程序中各函数简单说明见如表1函数说明所示:
返回值
函数名
参数表
函数说明
int
main
void
主函数
void
D_Insert
RecordTypeR[]
插入排序
void
BubbleSort
RecordTypeR[]
冒泡排序
int
Partition
RecordTypeR[]
划分算法
void
QuickSort
RecordTypeR[]
快速排序
void
SelectSort
RecordTypeR[]
选择排序
void
ShellSort
RecordTypeR[]
希尔排序
void
MergeSort
RecordTypeR[]
归并排序
void
HeapAdjust
RecordTypeR[]
堆排序
void
Display
显示
表1函数
3、运行环境
1)、软件环境
操作系统:
windows7、windows8
2)、硬件环境
处理器:
IntelPentium166MX或更高
内存:
64MB
硬盘空间:
1T
显卡:
SVGA显示适配
4开发工具和编程语言
编程环境:
Dev-C++5.0beta9.2(4.9.9.2)
编程语言:
C语言,ANSIC89
5详细设计
//*排序综合*/
#include
#defineMAXSIZE300
typedefstruct
{
intkey;
chardata;
}RecordType;
/*插入排序*/
voidD_Insert(RecordTypeR[],intn)
{//对n个记录序列R[1]~R[n]进行直接插入排序
inti,j;
for(i=2;i<=n;i++)
if(R[iM.key,R[i-1].key)
{//R[i].key小于R[i-1].key时需将R[i]插入到有序序列R[1]~R[i-1]中
R[0]=R[i];
j=i-1;
while(R[j].key>R[0].key)
{/*将关键字值大于R[i].key()即此时的R[0].key的
所有R[j](j=i-1,i-2,···)顺序后移一个记录位置*/
R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
}
/*冒泡排序*/
voidBubbleSort(RecordTypeR[],intn)
{//对R[1]~R[n]这n个记录进行冒泡排序
inti,j,swap;
for(i=1;i { swap=0; for(j=1;j<=n-i;j++) if(R[j].key>R[j+1].key) {//如果R[j].key大于R[j+1].key则交换它俩 R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; swap=1; } if(swap==0) break; } } /*快速排序*/ intPartition(RecordTypeR[],inti,intj)//划分算法 {//对R[i]~R[j],以R[i]为基准记录进行划分,并返回RKi]在划分后的正确位置 R[0]=R[i]; while(i { while(i //从左向右扫描查找第一个关键字小于R[0].key的记录R[j] j--; if(i { R[i]=R[j]; i++; } while(i //从左当右扫描查找第一个关键字大于R[0].key的记录R[i] i++; if(i { R[j]=R[i]; j--; } } R[i]=R[0]; returni; } voidQuickSort(RecordTypeR[],ints,intt) {//进行快速排序 inti; if(s { i=Partition(R,s,t); //i为基准记录的位置并由此将表分为R[s]~R[i-1]和R[i+1]~R[t]两部分 QuickSort(R,s,i-1); QuickSort(R,i+1,t); } } /*选择排序*/ voidSelectSort(RecordTypeR[],intn) {//对于R[1]~R[n]这n个记录进行选择排序 inti,j,k; for(i=1;i { k=i; for(j=i+1;j<=n;j++) if(R[j].key k=j; if(i! =k) { R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; } } } /*希尔排序*/ voidShellInsert(RecordTypeR[],intn,intd) {//对R[1]~R[n]这n个记录进行希尔排序,d为增长因子(步长) inti,j; for(i=d+1;i<=n;i++) { R[0]=R[i]; for(j=i-d;j>0&&R[0].key R[j+d]=R[j]; R[j+d]=R[0]; } } voidShellSort(RecordTypeR[],intn)//进行希尔排序 { intd[10],t,k; printf("\n输入增量因子的个数\n"); scanf("%d",&t); printf("由大到小输入每个增量因子: \n"); for(k=0;k scanf("%d",&d[k]); for(k=0;k ShellInsert(R,n,d[k]); } /*归并排序*/ voidMerge(RecordTypeR[],RecordTypeR! [],intk,intn)//一趟二路归并 { inti,j,l1,u1,l2,u2,m; l1=0; m=0; while(l1+k { l2=l1+k; u1=l2-1; if(l2+k-1 u2=l2+k-1; else u2=n-1; for(i=l1,j=l2;i<=u1&&j<=u2;m++) if(R[i].key<=R[j].key) R1[m]=R[i++]; else R1[m]=R[j++]; while(i<=u1) R1[m++]=R[i++]; while(j<=u2) R1[m++]=R[j++]; l1=u2+1; } for(i=l1;i R1[i]=R[i]; } voidMergeSort(RecordTypeR[],intn)//非递归方法进行归并排序 { inti,k; RecordTypeR1[MAXSIZE]; k=1; while(k { Merge(R,R1,k,n); for(i=0;i R[i]=R1[i]; k=2*k; } } /*堆排序*/ voidHeapAdjust(RecordTypeR[],ints,intt)//基于大根堆得堆排序 { inti,j; R[0]=R[s]; i=s; for(j=2*i;j<=t;j=2*j)//沿关键字较大的孩子向下调整,先假定为左孩子 { if(j j=j+1; if(R[0].key>R[j].key) break; R[i]=R[j]; i=j; } R[i]=R[0]; } voidHeapSort(RecordTypeR[],intn)//进行堆排序 { inti; for(i=n/2;i>0;i--) HeapAdjust(R,i,n); for(i=n;i>1;i--) { R[0]=R[1];R[1]=R[i]; R[i]=R[0]; HeapAdjust(R,1,i-1); } } /*显示*/ voidDisplay() { printf("*****插入排序按1*****\n"); printf("*****冒泡排序按2*****\n"); printf("*****快速排序按3*****\n"); printf("*****选择排序按4*****\n"); printf("*****希尔排序按5*****\n"); printf("*****归并排序按6*****\n"); printf("*****堆排序按7*******\n"); } voidmain()//主函数 { inti=1,j,x; intKey; RecordTypeR[MAXSIZE]; printf("\n****欢迎登陆排序系统****: \n"); printf("\n**以-1作为结束标志**: \n"); printf("\n请写出你要排序的数: \n"); scanf("%d",&x); while(x! =-1) { R[i].key=x; scanf("%d",&x); i++; } printf("输出有效数字: \n"); for(j=1;j printf("%4d",R[j].key); //printf("\nSort*\n")+ printf("\n请输入你要选择的排序类型: \n"); Display(); printf("EnterKey: "); scanf("%d",&Key); if(Key==1){ printf("插入排序如下: "); D_Insert(R,i-1); } elseif(Key==2){ printf("冒泡排序如下: "); BubbleSort(R,i-1); } elseif(Key==#){ printf("快速排序如下: "); QuickSort(R,1,i-1); } elseif(Key==4){ printf("选择排序如下: "); SelectSort(R,i-1); } elseif(Key==5){ printf("希尔排序如下: "); ShellSort(R,i-1); } elseif(Key==6){ printf("归并排序如下: "); MebgeSort(R,i-1); } elseif(Key==7){ printf("堆排序如下: "); HeapSort(R,i-1); } else printf("请输入1~7间的数字"); for(j=1;j printf("%4d",R[j].key); printf("\n"); } 6调试分析 1、测试中的问题举例: 在进行快速排序时输入一行数字当运行时无论怎样也不出现排序后的结果,经过多次检查后发现在进行划分算法时i,j的值取法不当,最后经重新修改后运行。 2、算法改进设想举例 在程序中有很多不如意的地方,在进行归并排序时用的是非递归的排序算法,算法略显冗杂。 在进行归并排序时可以采用递归排序,采用递归排序的思想对此进行快速的排序算法,另外还可以设计一个计算程序运行时间的函数并计算每个排序算法所耗费的时间,选出较为优秀的排序算法。 7测试结果 一、测试方法如下: 1、输入你想要测试的一组数字,并以-1作为结束标志 2、选择你想要进行的测试类型 3、调用你想要测试类型的函数 4、输出测试结果 二、测试结果如下: 1、插入排序结果 2、选择排序结果: 3、希尔排序结果: 4、归并排序结果: 5、堆排序结果: 参考文献 [1]严蔚敏,《数据结构(C语言版)》清华大学出版社 [2]谭浩强.《C语言程序设计》(第三版)清华大学出版社 [3]胡元义《数据结构教程》(C语言版)西安电子科技大学 [4]李春葆《数据结构教程》上机实验指导清华大学出版社 心得体会 通过这次的数据结构课程设计我深深地体会到数据结构思想在C语言编程中的巨大用途,在进行排序综合这个课程设计题目的过程中,我多处都运用了数据结构的思想,例如: 在我进行快速排序时其中的划分算法快速排序中起着桥梁的作用,正是数据结构的这种思想才能简便而又快捷的完成快速排序这项功能,另外堆排序中也运用了二叉树的思想。 完成这次课程设计的过程中还发现了自己的诸多不足之处,这次课程设计确确实实提高了自己的编程能力。 信息科学与工程学院课程设计成绩评价表 课程名称: 数据结构课程设计 设计题目: 排序综合 专业: 班级: 姓名: 学号: 序号 评审项目 分数 满分标准说明 1 内容 思路清晰;语言表达准确,概念清楚,论点正确;实验方法科学,分析归纳合理;结论严谨,设计有应用价值。 任务饱满,做了大量的工作。 2 创新 内容新颖,题目能反映新技术,对前人工作有改进或突破,或有独特见解 3 完整性、实用性 整体构思合理,理论依据充分,设计完整,实用性强 4 数据准确、可靠 数据准确,公式推导正确 5 规范性 设计格式、绘图、图纸、实验数据、标准的运用等符合有关标准和规定 6 纪律性 能很好的遵守各项纪律,设计过程认真; 7 答辩 准备工作充分,回答问题有理论依据,基本概念清楚。 主要问题回答简明准确。 在规定的时间内作完报告。 总分 综 合 意 见 指导教师年月日 ........忽略此处.......
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 排列组合 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)