内部排序算法比较毕业设计论文word格式.docx
- 文档编号:8704035
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:219.71KB
内部排序算法比较毕业设计论文word格式.docx
《内部排序算法比较毕业设计论文word格式.docx》由会员分享,可在线阅读,更多相关《内部排序算法比较毕业设计论文word格式.docx(18页珍藏版)》请在冰豆网上搜索。
内部排序算法比较毕业设计论文word格式
内部排序算法的比较
一目的
利用《数据结构》课程的相关知识完成各种内部排序算法的比较,计算出每种内部排序算法的关键字比较次数,移动次数几其时间复杂度。
利用C/C++语言进行程序设计,并规范地完成课程设计报告。
通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
二需求分析
1、基本要求
(1)对以下10种内部排序算法进行比较:
起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序、折半插入排序、二路插入排序、归并排序、基数排序。
(2)待排序表的表长不小于100;其中的数据要用伪随机数产生器产生;至少要用5组不同的输入数据做比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换为3次移动)。
(3)针对不同的输入表长做试验,观测检查两个指标相对表长的变换情况。
(4)随机产生的数据保存到文件input.txt中,将各个算法的关键字比较次数和关键字移动次数的比较分析结果,显示输出到屏幕,并保存到Out.txt文件中。
2、数据测试
测试数据由系统随机数生成器生成,并且保存到文件件input.txt中。
三概要设计
1、获取随机数
voidInitList(SqList&H,SqListL),动态法分配数组,以存储关键字。
voidGetKey(SqList&L,intn),产生随机数,即产生关键字。
2、始终内部排序法函数:
InsertSort(H1,w),直接插入排序函数。
BInsertsort(H6,w),折半插入排序函数。
P2_InsertSort(H7,w),2_路插入排序函数。
Shellsort(H2,dlta,7,w),希尔排序函数。
BubbleSort(H3,w)冒泡排序函数。
QuickSort(H4,w),快速排序函数。
SelectSort(H5,w),简单选择排序函数。
HeapSort(H,w),堆排序函数
MergeSort(H8,w),归并排序函数。
RadixSort_ascend(H,P),基数排序函数。
3、元素移动次数与比较次数:
当两个元素值进行交换时,元素移动次数为三。
两元素每比较一次,move值加一。
4、程序模块
1)主程序模块
voidmain()
{//初始化;
//开辟空间;
do{//接受命令;
//处理命令;
}while(命令==“继续”);
}
2)随机模块——随机产生数组和可用数据文档
3)十种内部排序函数
4)函数的调用关系图反映程序的层次结构:
四详细设计
1、头文件定义:
#include
#include
#include
#include
#include
#include
#include
#include
//intMAXSIZE[]={100,200,500,1000};//数组递增表
#defineLT(a,b)((a)<(b))
//#defineRadix10
typedefintKeyType;
intdlta[7]={33,17,9,5,3,2,1};//希尔增量数组
intcompare=0,move=0;//比较,移动次数,全局变量
doubletimes,start,end;
2、存储结构描述:
typedefstruct
{
KeyTypekey;//关键字项
}RedType;//链表存储
typedefstruct
{
RedType*r;//数据元素存储基地址,动态分配数组
intlengh;//数组长度
}SqList;//动态数组
以下为基数排序存储结构
#definemaxspace10000
typedefstruct{
intkey;
intnext;
}SLCell;
typedefstruct{
SLCellr[maxspace];
intkeynum;
intrecnum;
}SList;
3、主函数及其他子函数描述:
intmain()
{
//主程序
//定义变量
do{
提示菜单,按要求输入,选择操作。
Case1:
GetKey(),产生随机数,即关键字。
H1=paixu()。
Case2:
//待排序数组逆序
H1=paixu()。
Case3:
//移动次数及比较次数赋为0。
H1=paixu()。
}while
}
voidGetKey()
{L.r=(RedType*)malloc(sizeof(RedType)*n)//动态分配数组大小
//调用随机数生成函数,根据main函数中输入的变量,确定产生元素个数。
}
SqListpaixu()
{//定义变量
InitList(),动态分配数组大小,等到每种排序的初始数据,使得每种排序的初始数据都相同。
//分别调用十种内部排序算法的函数,及其时间函数。
并将排序过程中的移动次数,关键字比较次数,还有所需时间输出。
}
voidInitList()
{for(inti=0;i<=L.lengh;i++)
H.r[i]=L.r[i];
H.lengh=L.lengh;
//动态分配数组,将得到的随机数存入其他与原存储结构相同的存储结构中
}
voidInsertSort(SqList&L,intc,intmo)
{//对顺序表L做直接插入排序。
IfL.r[i]>=L.r[i+1]
Theswap(L.r[i],L.r[i+1]),compare+=3
Elsei++
}
voidBInsertsort(SqList&L,intc,intmo)
{//折半插入排序。
fori<=L.lengh
{M=(low+high)/2
if(LT(L.r[i].key,L.r[m].key))
{high=m-1;}
else
{low=m+1;}
}
for(j=i-1;j>=high+1;j--)
{L.r[j+1]=L.r[j]
//进行元素交换
}
}
voidP2_InsertSort(SqList&L,intm,intn)
{//2_路插入排序
d=(RedType*)malloc(L.lengh*sizeof(RedType))
//生成L.length个记录的临时空间
for(i=2;i<=L.lengh;++i)//依次将L的第2个~最后1个记录插入d中
{compare++;
if(L.r[i].key {//待插记录小于d中最小值,插到d[first]之前(不需移动d数组的元素) //设d为循环向量 d[first]=L.r[i]; } else {if(L.r[i].key>d[final].key) {//待插记录大于d中最大值,插到d[final]之后(不需移动d数组的元素) d[final]=L.r[i]; } else {//待插记录大于d中最小值,小于d中最大值,插到d的中间 (需要移动d数组的元素)。 j=final++;//移动d的尾部元素以便按序插入记录 } voidShellsort(SqList&L,intdlta[],intt,intc,intmo) {//希尔排序 ShellInsert(L,dlta[k]) //一趟增量为dlta[k]的插入排序 } voidShellInsert(SqList&L,intdk) {//对顺序表L做一趟希尔插入排序,r[0]做暂存单元,当j<=0时插入位置找到 { L.r[j+dk]=L.r[j];//记录后移,查找插入位置 j-=dk; }while(j>0&<(L.r[0].key,L.r[j].key)); L.r[j+dk]=L.r[0];//插入 } voidBubbleSort(SqList&L,intm,intn) {//起泡法排序 for(i=1;i {for(j=1;j {if(L.r[j].key>L.r[j+1].key) Swap(L.r[j].key,.r[j+1].key) } } voidQuickSort(SqList&L,intm,intn) {//对顺序表L做快速排序。 QSort(L,1,L.lengh) } voidQSort(SqList&L,intlow,inthigh) {//对顺序表中的子序列L.r[low...high]做快速排序 Iflow The pivotloc=Partition(L,low,high);//将L.r[low...high]一分为二 QSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置 QSort(L,pivotloc+1,high);//对高子表递归排序 } intPartition(SqList&L,intlow,inthigh) {//交换顺序表L中子表r[low...high]的记录,枢轴记录到位并返回所在位置,此时在它之前(后)的记录位置均不大(小)于它. while(low {while(low {--high; } L.r[low]=L.r[high];//将比枢轴记录小的记录移动到低端 while(low {++low;} L.r[high]=L.r[low];//将比枢轴记录大的记录移动到高端} L.r[low]=L.r[0];//枢轴记录到位 returnlow;//返回枢轴位置} } voidSelectSort(SqList&L,intm,intn) {//对顺序表L做简单选择排序 for(i=1;i for(k=i+1;k<=L.lengh;k++)//在L.r[i....L.lengh]中选择key最小的记录 ifL.r[k].key j=k; swap(L.r[k].key,.r[j].key)//元素交换 } voidHeapSort(HeapType&H,intm,intn) {//堆排序 for(i=H.lengh;i>1;--i) swap(H.r[1].key,H.r[i].key) //堆顶记录和当前未排子序列中最后一个记录相交换。 HeapAdjust(H,1,i-1);//将H.r[l..i-1]重新调整为大/小顶堆 } voidHeapAdjust(HeapType&H,ints,intm) {//H.r[s..m]中除H.r[s].key外均满足堆的定义 //调整H.r[s]的关键字,使H.r[s..m]成为一个小顶堆 } voidMergeSort(SqList&L,intm,intn) {//归并排序 MSort(L,L,1,L.lengh) } voidMSort(RcdTypeSR,RcdTypeTR1,ints,intt) {//对待排序数列进行分划 if(s==t) TR1.r[s].key=SR.r[t].key; Else m=(s+t)/2; MSort(SR,TR2,s,m); MSort(SR,TR2,m+1,t); Merge(TR2,TR1,s,m,t); } voidMerge(RcdTypeSR,RcdType&TR,inti,intm,intn) {//对分划好的数组进行归并 for(j=m+1,k=i;i<=m&&j<=n;++k) {if(SR.r[i].key<=SR.r[j].key) TR.r[k].key=SR.r[i++].key; Else TR.r[k].key=SR.r[j++].key; } } voidRadixSort_ascend(SqList&H,SList*L,intm,intn) {//基数排序 distribute(H,L->r,i,f,e) Collect_ascend(H,L->r,f,e) } voiddistribute(SqList&H,SLCell*r,inti,int*f,int*e) {for(p=r[0].next;p;p=r[p].next) {if(! f[j])f[j]=p;e[j]=p; elser[e[j]].next=p; e[j]=p;//将P所指的节点插入第J个子表中 } } voidCollect_ascend(SqList&H,SLCell*r,int*f,int*e) {//按照关键字将各个子表依次连接为一个链表 while(j<10){ for(j=succ_ascend(j,f);j<9&&(! f[j]);j=succ_ascend(j,f)) //找到下一个非空字表 if(f[j]&&j<10) {r[t].next=f[j]; t=e[j]; }//连接两个非空字表 } intsucc_ascend(intj,int*f) {while(t<=9) if(f[t]! =0) returnt; elset++; return10; } 4、程序主流程图 五调试分析 1.在写本程序之前,首先要熟悉每种排序算法的思想,了解每种排序法在最好最坏及平均情况下的时间复杂度、元素比较次数及元素移动次数。 2.在了解了每种排序算法的思想后,应注意,其实本程序虽说是三种要求排序,但其实三类要求排序的代码段都是相同的,每种排序都只用一种算法就可以,特别注意逆序排序,不是直接调用第一次排序的结果,而是调用第一次结果的逆序数列,为逆序排序的初始数据。 3.基数排序的存储结构比较特殊,需要一特别定义一些新的存储结构,另外需要定义一个基数量maxspace。 4,元素移动次数上要小心,当进行两个元素交换操作时,引入了一个辅助的空间,即哨兵,当进行两个元素交换操作时,需要三次赋值操作,所以,当两个元素交换时,元素移动次数为3而不是2。 六测试结果 测试结果如下: 1.当初始操作时,得到随机数据,写入文件“intput.txt”: 将这组数据按照要求排序,得到的三组排序结果如图: 1).随机数排序结果: 此时,排好序的数据输出到“output1.txt”中,结果如图: 2.调用第一组排序的结果,进行第二次排序,逆排序排序结果如图: 输出的排序结果为: 输出文档中的数据为: 3.进行第三次排序,调用第二次排序的结果,屏幕输出结果为: 输出文档中的数据与上两步中的结果相同。 七用户使用说明 1.本程序的运行环境为VC 2.运行后,在界面上会有一个选择菜单如图: 根据提示输入1、2、或3(要求第一次运行输入时输入为1,要产生随机数)。 3.再输入“1”的情况下: 按照提示输入,一般输入数据为100的整数倍。 4.再输入100的情况下: 按提示输入,进行操作。 5.输入Y以后: 此时,可按提示进行输入,可执行2.、3操作。 6、在选择2操作命令后: 按提示输入。 7、再输入Y后,菜单界面如同第⑤步,其他键(除enter键)则结束操作。 8、再输入Y的情况下,按提示输入,选择3操作的结果如图: 可进行循环操作,也可以在此基础上再次进行2、3操作,操作结果不变。 八课程设计总结 1.完成这个课程设计达到了实验的目的,加强了对各种内部排序法的的了解,同时提高了对这部分知识的运用能力,当然编程的能力也有所历练和提高。 2.由于本程序用到文件的输入输出,这让以前经常忽视文件应用知识的我 掌握了文件的运用。 同时在完成此程序的过程中,学习了随机函数,自觉丰富了知识,学到很多,以后对于编程应该很有用。 3.一级指针,二级指针,指针函数以及指向函数的指针及数组的运用,让 我更加熟悉这些知识,不仅是个复习已学知识的机会,也是个重新学习的机会 4.写程序就会出错,出错就要改错,在成功完成实验的过程中,改错能力。 也有所提高,改错也是个熟练运用知识的的过程,也是个相当重要的个人能力。 5.对于界面的控制部分,其实是每个程序员都要很慎重考虑的部分,好的界面有助于用户更好操作,所以实现一个好的易操作的界面环境也是我们需要好好锻炼和学习的,在不断学习和编程中提高能力,同时也养成好的编程习惯。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内部 排序 算法 比较 毕业设计 论文 word 格式