排序综合课程设计报告Word格式文档下载.docx
《排序综合课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《排序综合课程设计报告Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
本系统拟实现以下功能:
1.直接插入排序
2.希尔排序
3.快速排序
4.堆排序
5.结果保存
6.计算排序时间
系统要求采用VC6.0工具进行开发实现。
任务要求
综合运用和融化所学理论知识,提高分析和解决实际问题的能力,使用c语言设计一个排序综合系统。
完成课程设计报告,报告中对关键部分给出图表说明。
要求格式规范,工作量饱满。
参考文献
[1]数据结构.严蔚敏,吴伟民编著.清华大学出版社.2007年03月
[2]数据结构、算法与应用:
C++语言描术.(美)萨尼(Sahni,S.)著,汪诗林等译.机械工业出版社.2005年03月
审查意见
指导教师签字:
教研室主任签字:
2010年6月24日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
信息科学与工程学院课程设计成绩评价表
课程名称:
数据结构课程设计
设计题目:
排序
序号
评审项目
分数
满分标准说明
1
内容
思路清晰;
语言表达准确,概念清楚,论点正确;
实验方法科学,分析归纳合理;
结论严谨,设计有应用价值。
任务饱满,做了大量的工作。
2
创新
内容新颖,题目能反映新技术,对前人工作有改进或突破,或有独特见解
3
完整性、实用性
整体构思合理,理论依据充分,设计完整,实用性强
4
数据准确、可靠
数据准确,公式推导正确
5
规范性
设计格式、绘图、图纸、实验数据、标准的运用等符合有关标准和规定
6
纪律性
能很好的遵守各项纪律,设计过程认真;
7
答辩
准备工作充分,回答问题有理论依据,基本概念清楚。
主要问题回答简明准确。
在规定的时间内作完报告。
总分
综
合
意
见
指导教师年月日
1、需求分析
1.1、直接插入排序
思路:
设有一组关键字{K1,K2,…….,Kn},排序开始变认为K1是一个有序的序列,让K2插入到表长为1的有序序列,使之成为一个表长为2的有序序列,让K3插入到表长为2的有序序列,使之成为一个表长为3的有序序列,依次类推,最后让Kn插入上述表长为n-1的有序序列,得到一个表长为n的有序序列.
1.2、希尔排序
思路:
先取一个正整数d1(d1<
n),把全部记录分成d1个组,所有距离为d1的倍数的记录看成是一组,然后在各组内进行插入排序;
然后取d2(d2<
d1),重复上述分组和排序操作,直到取di=1(>
=1),即所有记录成为一个组为此.一般选d1约为n/2,d2为d1/2,…….,di=1
1.3、快速排序:
(递归和非递归)
以第一个关键字K1为控制字,将[K1、K2、….Kn]分成两个子区,使左区的有关键字小于等于K1,右区所有关键字大于等于K1,最后控制居两个子区中间的适当位置。
在子区内数据尚处于无序状态。
将右区首、尾指针保存入栈,对左区进行与第
(1)步相类似的处理,又得到它的左子区和右子区,控制字区中。
重复第
(1)、
(2)步,直到左区处理完毕。
然后退栈对一个个子区进行相类似的处理,直到栈空
分区处理函数hoare
首先用两个指针i、j分别指向首、尾两个关键字,i=1,j=8。
如对(46、56、14、43、95、10、19、72)。
第一个关键字46作为控制字,该关键字所属的记录另存储在一个x变量中。
从文件右端元素r[j].key开始与控制字x.key相比较,当r[j].key大于等于x.key时,r[j]不移动,修改指针j,j--,直到r[j].key<
x.key,把记录r[j]移动到文件左边i所指向的位置;
然后在文件左边修改i指针,i++,让r[i].key与x.key相比较,当r[i].key小于等于x.key时,r[i]不移动,修改指针i,i--,直到r[i].key<
x.key,把记录r[i]移动到文件右边j所指向的位置;
然后在文件右边修改j指针j--。
重复上面的步骤.
1.4、堆排序
把n个记录存于向量r之中,把它看成完全二叉树,此时关键字序列不一定满足堆的关系。
堆排序大体分为两步处理:
初建堆,从堆的定义出发,当i=1、2、。
。
、[2/n]时应满足ki<
=k2i和ki<
=k2i+1.所以先取i=[n/2](它一定是第n个结点的双亲编号),将以i结点为根的子树调整为堆,然后令i=i-1,将以不结点为根的子树调整为堆。
此时可能会反复调整某些结点,直到i=1为止,堆初步建成。
堆排序,首先输出堆顶元素(一般是最小值),让堆中最后一个元素上移到原堆顶位置,然后恢复堆。
因为经过第一步输出堆顶元素的操作后,往往破坏了堆关系,所以要恢复堆;
重复执行输出堆顶元素、堆尾元素上移和恢复堆的步骤。
2、概要设计
2.1、头文件
#include<
stdio.h>
stdlib.h>
cstdlib>
time.h>
2.2、ADT
structelement
{
intkey;
}list[20];
structrnode
intpoint;
};
2.3、各种操作函数:
(1)创建一个数组函数:
intcreat();
(2)输出数组函数:
voidprint(structelementa[20],intn);
(3)保存函数:
voidsave(structelementa[SIZE],intn,charfileName[])
(4)直接插入排序函数:
voidinsert_sort(elementa[],intn)
(5)希尔排序函数:
voidshell(structelementa[20],intn);
(6)快速排序函数(分区处理函数):
inthoare(structelementa[20],intl,inth);
(7)非递归的快速排序函数:
voidquick1(structelementa[20],intn);
(8)递归的快速排序函数:
voidquick2(structelementa[20],intl,inth);
(9)堆排序(调整堆的函数):
voidheap(structelementa[20],inti,intm);
(10)堆排序(主体函数):
voidheapsort(structelementa[20],intn);
(11)时间函数:
start=clock();
end=clock();
2.4、主函数
Voidmain()
接受命令(选择要执行的操作);
处理命令;
输出结果;
}
3、详细设计
3.1、程序源代码:
#defineSIZE1000000
}list[SIZE];
///////创建一个数组////////
intcreat()
inti,n;
intnum;
n=0;
printf("
请输入元素个数:
"
);
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
{
list[n].key=rand()%10000;
n++;
}
return(n);
/////////////输出数组/////////////
voidprint(structelementa[SIZE],intn)
inti;
for(i=0;
i<
n;
i++)
%5d"
a[i].key);
\n"
/////////////保存到文件/////////////
intm_wr=0;
//写入TXT文件变量
FILE*fp;
if((fp=fopen(fileName,"
w"
))==NULL)
Filewritererror\n"
for(intm=0;
m<
m++)
{
m_wr=a[m].key;
fprintf(fp,"
%d"
m_wr);
//写入TXT中
}
fclose(fp);
////////////////////直接插入排序///////////////////
inti,j;
elementnext;
for(i=1;
i<
i++)
next=a[i];
for(j=i-1;
j>
=0&
&
next.key<
a[j].key;
j--)
a[j+1].key=a[j].key;
a[j+1]=next;
输出直接插入排序的结果:
/////////////////希尔排序//////////////////////
voidshell(structelementa[SIZE],intn)
inti,j,k;
for(i=n;
i>
=1;
i--)
a[i].key=a[i-1].key;
k=n/2;
while(k>
=1)
for(i=k+1;
=n;
{
a[0].key=a[i].key;
j=i-k;
while((a[j].key>
a[0].key)&
(j>
=0))
{
a[j+k].key=a[j].key;
j=j-k;
}
a[j+k]=a[0];
}
k=k/2;
a[i].key=a[i+1].key;
输出希尔排序的结果:
////////////////////快速排序///////////////////////////
inthoare(structelementa[SIZE],intl,inth)//分区处理函数
inti,j;
structelementx;
i=l;
j=h;
x.key=a[i].key;
do
while((i<
j)&
(a[j].key