数据结构课程设计报告内部排序算法的性能分析.docx
- 文档编号:23227516
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:20
- 大小:99.43KB
数据结构课程设计报告内部排序算法的性能分析.docx
《数据结构课程设计报告内部排序算法的性能分析.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告内部排序算法的性能分析.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告内部排序算法的性能分析
《数据结构》课程设计报告
教学计划编制问题
内部排序算法的性能分析
学院(系):
数学与统计学院
班级:
1
学生姓名:
杨晓格
学号:
指导教师:
韩逢庆
时间:
从2011年12月31日到2012年1月6日
一、课程设计概述:
本次数据结构课程设计共完成二个题:
a.教学计划编制问题b.内部排序算法的性能分析
使用语言:
C
编译环境:
/
二、课程设计题目一
[实验内容]
教学计划编制问题
[问题描述]
答学的每个专业都要制定教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
试在这样的前提下设计一个教学计划编制程序
[需求分析]
(1)输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。
(2)允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
[概要设计]
mdinit()/*初始化教学计划*/
voidselect(intquee[],inti,intj,mda)/*使课程集中在前面*/
voidarrage(mda)/*教学计划函数*/
[流程图]
[详细设计]
#include<>
#include<>
#defineNULL0
#definemaxsize100
typedefstructstu
{
intnumber;
intscore;
structstu*next;
}node;
typedefstruct
{
intvex_num;
intvex_sco;
inthave;
node*first;
}sd;
typedefstruct
{
sdarry[maxsize];
intmax_class;
intmax_term;
intscore_limit;
}md;
mdinit()
{
inti,x,c;
mda;
node*p;
printf("enterclasstotal:
");
scanf("%d",&;
printf("entertermtotal:
");
scanf("%d",&;
printf("enterscorelimit:
");
scanf("%d",&;
printf("enterclassarrange\n");
for(i=1;i<=;i++)
[i].first=NULL;
for(i=1;i<=;i++)
{
printf("enter%iclassnumberandscore:
",i);
scanf("%d%d",&[i].vex_num,&[i].vex_sco);
printf("enter%ipriorclass:
",i);
c=0;
do
{
scanf("%d",&x);
if(x>0)
{
p=(node*)malloc(sizeof(node));
p->number=[i].vex_num;
p->next=[x].first;
[x].first=p;
c++;
}
}while(x>0);
[i].have=c;
}
returna;
}
/*voiddisp(mda)
{
node*p;
inti;
for(i=1;i<=;i++)
{
printf("%d",[i].vex_num);
p=[i].first;
while(p!
=NULL)
{
printf("%d",[p->number].vex_num);
p=p->next;
}
printf("\n");
}
}*/
voidselect(intquee[],inti,intj,mda)
{
intk,temp,min;
min=i;
for(k=i+1;k<=j;k++)
if[quee[k]].vex_sco<[quee[min]].vex_sco)
min=k;
if(min!
=i)
{
temp=quee[i];
quee[i]=quee[min];
quee[min]=temp;
}
}
voidarrage(mda)
{
intquee[maxsize],front,bare,i,j,total_score;
node*p;
front=bare=0;
j=1;
for(i=1;i<=;i++)
if[i].vex_num!
=0&&[i].have==0)
quee[++bare]=[i].vex_num;
printf("\n%dtermstudy:
",j++);
total_score=0;
while(front!
=bare)
{
select(quee,front+1,bare,a);
if(total_score+[quee[front+1]].vex_sco<=
{
printf("%d",[quee[front]].vex_num);
[quee[front]].vex_num=0;
total_score+=[quee[front]].vex_sco;
p=[quee[front]].first;
while(p!
=NULL)
{
[p->number].have--;
if[p->number].have==0)
quee[++bare]=[p->number].vex_num;
p=p->next;
}
}
else
{
total_score=0;
printf("\n%dtermstudy:
",j++);
}
}
}
main()
{
mdh;
h=init();
arrage(h);
}
[调试分析]
问题:
现象:
最后结果存在问题,无法提供内存
原因:
函数的参数没有写正确
:
[运行结果及分析]
课程设计题目二
[实验内容]
内部排序算法的性能分析
[问题描述]
。
设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受
[需求分析]
(1)对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较;
(2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标有:
关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动);
(3)输出比较结果。
[概要设计]
main()
SqListL;
addlist(L);
qipao(L);
InsertSort(L);
SelectSort(L);
QuickSort(L);
addlist(L);
MergeSort(L);
[流程图]
[详细设计]
#include<>
#include<>
#include<>
#include<>
#defineLIST_INIT_SIZE50000
intbj1,yd1,n;
clock_tstart_t,end_t;
typedefstruct
{
intkey;
}ElemType;
typedefstruct
{
ElemType*elem;
intlength;
}SqList;
voidaddlist(SqList&L)
{
inti;
a:
printf("请输入你要输入的个数:
");
scanf("%d",&n);
if(n>50000)
{
printf("超出范围重新输入!
!
!
\n");
gotoa;
}
=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
exit(0);
=0;
for(i=1;i { b: [i].key=rand(); if[i].key>30000)gotob; ++; } } voidSelectSort(SqList&L)ey<[k].key)k=j; } if(i! =k) { [0].key=[i].key; [i].key=[k].key; [k].key=[0].key; yd+=3; } } end_t=clock(); printf("比较次数为%d移动次数为%d\n",bj,yd); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidqipao(SqList&L)ey>[j+1].key) { [0].key=[j].key; [j].key=[j+1].key; [j+1].key=[0].key; yd+=3; } } i++; } end_t=clock(); printf("比较次数为%d移动次数为%d\n",bj,yd); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidInsertSort(SqList&L)ey<[i-1].key) { [0].key=[i].key; yd++; j=i-1; bj++; while[0].key<[j].key) { [j+1].key=[j].key; j--; yd++; bj++; } [j+1].key=[0].key; yd++; } } end_t=clock(); printf("比较次数为%d移动次数为%d\n",bj,yd); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidxier(SqList&L)ey>[j].key) { k=j; bj++; } } if(i! =k) { [0].key=[i].key; [i].key=[k].key; [k].key=[0].key; yd+=3; } w++; } d=d/2; w=1; } end_t=clock(); printf("比较次数为%d移动次数为%d\n",bj,yd); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidBeforeSort() { yd1=0,bj1=0; } voiddisplay(intm,intn) { printf("比较次数为%d移动次数为%d\n",m,n); } intPartition(SqList&L,intlow,inthigh)ey; while(low { yd1++; while(low --high; [low]=[high]; bj1++; yd1++; while(low ++low; [high]=[low]; bj1++; yd1++; } [low]=[0]; yd1++; returnlow; } voidQSort(SqList&L,intlow,inthigh) { intpivotloc; if(low { pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); } } voidQuickSort(SqList&L) { start_t=clock(); BeforeSort(); QSort(L,1,; display(yd1,bj1); end_t=clock(); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidMerge(ElemTypeR[],ElemTypeR1[],intlow,intm,inthigh)ey<=R[j].key) { bj1++; R1[k]=R[i]; yd1++; i++; k++; } else { bj1++; R1[k]=R[j]; yd1++; j++; k++; } } while(i<=m) { R1[k]=R[i]; yd1++; i++; k++; } while(j<=high) { R1[k]=R[j]; yd1++; j++; k++; } } voidMergePass(ElemTypeR[],ElemTypeR1[],intlength,intn) { inti=0,j; while(i+2*length-1 { Merge(R,R1,i,i+length-1,i+2*length-1); i=i+2*length; } if(i+length-1 Merge(R,R1,i,i+length-1,n-1); else for(j=i;j R1[j]=R[j]; } voidMSort(ElemTypeR[],ElemTypeR1[],intn) { intlength=1; while(length { MergePass(R,R1,length,n); length=2*length; MergePass(R1,R,length,n); length=2*length; } } voidMergeSort(SqList&L) { start_t=clock(); BeforeSort(); MSort,,; display(yd1,bj1); end_t=clock(); printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); } voidmain() { SqListL; addlist(L); printf("起泡排序: \n"); qipao(L); addlist(L); printf("直插排序: \n"); InsertSort(L); addlist(L); printf("选择排序: \n"); SelectSort(L); addlist(L); printf("希尔排序: \n"); xier(L); addlist(L); printf("快速排续: \n"); QuickSort(L); addlist(L); printf("归并排序: \n"); MergeSort(L); } [运行结果及分析] 四、课程设计心得 一周的课程设计结束了,从课程设计的学习过程结束了,一开始,我并不知道要学这门课,我一直打算复习好考试的科目的,所以说是实话,我刚开始的时候,真的是很懊恼,很纠结。 可是仔细想想不管我愿意或者不愿意,我都必须学习,这是我的责任,我不可推卸。 我唯一可以做的就是好好学习,更好的安排好我的学习时间,更加有计划的利用好我的时间。 有句话说的好,时间是挤出来的。 而且渐渐地我明白了一个道理,环境一直在改变,没有人知道未来的自己会遭遇什么样的事情,惟有发展好自己才是最根本的,最有效的办法。 还有就是,课程设计这门课,让我体会到会编写有用的程序是多么的充实,内心会得到满足。 程序这个东西,其实呢,并没有我们想象的那么难,那么复杂,我们只要认认真真的去学习,没有什么事情是可以难倒我们的。 所以,我很高兴自己可以上这门课,也很开心我可以明白这个道理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 内部 排序 算法 性能 分析