




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内部排序算法比较班级: 姓名: 学号: 完成日期:题目:试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。一需求分析1.对常用的6种内部排序算法进行比较:冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。2.待排序表的表长不小于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)3.最后要对结果作出简单分析,包括对各组数据得到结果波动大小的解释。二概要设计1.主界面设计对六种内部排序算法进行比较,可通过随机数程序产生几组数,要求用户手动输入产生随机数的个数。运行界面如图所示:选择1运行程序,选择2退出程序2存储结构设计本程序采用顺序表结构,具体结构定义如下:typedef struct int key; ElemType;typedef struct ElemType *elem; int length;SqList;3.系统功能设计1)分配内存空间。创建顺序表2)利用伪随机数产生程序产生随机数,作为程序运行的数据3)实现每种排序算法的功能函数三模块设计随机数产生模块1.模块设计主程序模块排序算法模块2.系统子程序及功能设计本系统共设置13个函数,其中包括主函数。各函数名及功能说明如下。1) void addlist(SqList &L) /建立个空顺序表2) void random(SqList &L) /随机数产生函数3) void memory(SqList &M,SqList &L) /记录L,以保证每个排序函数使用一组随机数4) void BubbleSort(SqList &L) /冒泡排序5) void InsertSort(SqList &L) /直接插入排序6) void SelectSort(SqList &L) /选择排序7) int Partition(SqList &L,int low,int high) /返回快速排序枢轴的位置8) void QSort(SqList &L,int low,int high) /对子序列作快速排序9) void QuickSort(SqList &L) /对数序表作快速排序10)void ShellSort (SqList &L) /希尔排序11)void HeapAdjust(SqList &L,int s,int m )/堆排序算法子程序12)void HeapSort(SqList &L) /对顺序表进行堆排序13)void main() /主函数,调用各模块函数3.函数主要调用关系913)main()51243211068117四详细设计1.数据类型定义typedef struct int key; ElemType;typedef struct ElemType *elem; int length;SqList;2.全局变量定义int bj1=0,yd1=0,bj2=0,yd2=0,bj3=0,yd3=0,bj4=0,yd4=0,bj5=0,yd5=0,bj6=0,yd6=0;/记录每种算法的比较,移动次数int n;/随机数的个数2.系统主要子程序详细设计(1)主函数设计模块主要是输入数据,以及程序界面的设计,调用系统的各个子程序,并输出结果。(详见源程序)(2)随机数产生模块利用伪随机数产生程序产生数据,并存储到顺序表中。void random(SqList &L) L.length=0;static bool first=true;if(first)srand(time(0);first=false;/使每次产生的随机数不同for(int i=1;i30000) goto a; +L.length; (3)排序算法模块实现冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序以及堆排序的算法。(祥见源程序)五测试分析运行程序后,得到如图所示:输入:1输入:100选择1重复上述步骤,输入150,200,250,300得到另外四个结果:退出程序,请选择:2结果分析:冒泡排序,直接插入排序以及简单选择排序比较次数较多,快速排序,希尔排序及堆排序比较次数较少;并可得冒泡排序和直接插入排序相对较稳定,其他四种内部排序为不稳定排序。六源程序清单#includeiostream#includestdio.h#includestdlib.h#includestring.h#includetime.husing namespace std;#define LIST_INIT_SIZE 50000int bj1=0,yd1=0,bj2=0,yd2=0,bj3=0,yd3=0,bj4=0,yd4=0,bj5=0,yd5=0,bj6=0,yd6=0,n;/yd,bj为记录关键字比较和移动的次数typedef struct int key; ElemType;typedef struct ElemType *elem; int length;SqList;void addlist(SqList &L)/初始化顺序表a: printf(请输入你要输入的个数:); scanf(%d,&n); if(n50000) printf(超出范围重新输入!n); goto a; L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem)exit(0);void random(SqList &L)/随机数产生程序 L.length=0;static bool first=true;if(first)srand(time(0);first=false;/使输入相同个数时每次产生的随机数不同for(int i=1;i30000) goto a; +L.length; void memory(SqList &M,SqList &L)/记录L,使每个排序算法都用一组相同的随机数 M.length=0;for(int i=1;in+1;i+)M.elemi.key=L.elemi.key;+M.length;void BubbleSort(SqList &L)/冒泡排序int i,j;for(i=1;iL.length;i+)for(j=1;jL.elemj+1.key) L.elem0.key=L.elemj.key; L.elemj.key=L.elemj+1.key; L.elemj+1.key=L.elem0.key; yd1+=3; void InsertSort(SqList &L)/直接插入排序 int i,j; for(i=2;i=L.length;i+) if(L.elemi.keyL.elemi-1.key) L.elem0.key=L.elemi.key; yd2+; j=i-1; bj2+; while(L.elem0.keyL.elemj.key) L.elemj+1.key=L.elemj.key; j-; yd2+; bj2+; L.elemj+1.key=L.elem0.key; yd2+; void SelectSort(SqList &L)/选择排序 int i,j,k; for(i=1;iL.length;i+) k=i; for(j=i+1;jL.length;j+) bj3+; if(L.elemj.keyL.elemk.key)k=j; if(i!=k) L.elem0.key=L.elemi.key; L.elemi.key=L.elemk.key; L.elemk.key=L.elem0.key; yd3+=3; int Partition(SqList &L,int low,int high)/快速排序 int pivotkey; L.elem0=L.elemlow; yd4+; pivotkey=L.elemlow.key; while (lowhigh) yd4+; while(low=pivotkey) -high; L.elemlow=L.elemhigh; bj4+; yd4+; while (lowhigh&L.elemlow.key=pivotkey) +low; L.elemhigh=L.elemlow; bj4+; yd4+; L.elemlow=L.elem0; yd4+; return low;void QSort(SqList &L,int low,int high)/对顺序表的子序列作快速排序 int pivotloc; if(lowhigh) pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); void QuickSort(SqList &L)/对顺序表L作快速排序 QSort(L,1,L.length);void ShellSort(SqList &L)/希尔排序 int i,d=L.length/2,j,w=0,k; while(wd) w=1; for(i=w;iL.length;i=i+d) k=i; for(j=i+d;jL.elemj.key) k=j; bj5+; if(i!=k) L.elem0.key=L.elemi.key; L.elemi.key=L.elemk.key; L.elemk.key=L.elem0.key; yd5+=3; w+; d=d/2; w=1; void HeapAdjust(SqList &L,int s,int m )/调整L.elems的关键字,使L.elems.m成为一个大根堆SqList rc; rc.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!rc.elem)exit(0);int j;rc.elem0=L.elems;for(j=2*s;j=m;j*=2)bj6+;if(jm&L.elemj.keyL.elemj+1.key)+j;bj6+;if(!(rc.elem0.key0;-i)HeapAdjust(L,i,L.length);for(i=L.length;i1;-i)L.elem1=L.elemi;yd6+=3;HeapAdjust(L,1,i-1);void main() SqList L,M; int a; M.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!M.elem)exit(0);a:cout -内部排序算法比较-n; cout*欢迎使用*n;cout*(1)运行程序*n;cout*(2)退出系统*n; coutendl; cout请选择:; scanf(%d,&a);switch(a) case 1:system(cls);addlist(L);break;case 2:cout谢谢使用;exit(0);break; random(L); memory(M,L); BubbleSort(M); memory(M,L); InsertSort(M); memory(M,L); SelectSort(M); memory(M,L); QuickSort(M); memory(M,L); ShellSort(M); memory(M,L); HeapSort(L); cout *比较次数*移动次数*n; cout冒泡排
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025黑龙江哈尔滨“丁香人才周”(春季)事业单位引才招聘模拟试卷及答案详解(全优)
- 2025年国家知识产权局知识产权检索咨询中心社会招聘(16人)考前自测高频考点模拟试题及答案详解参考
- 2025安徽芜湖市中西医结合医院(湾沚区总医院)招聘第三方救护车驾驶员(第二批)1人考前自测高频考点模拟试题完整参考答案详解
- 2025江西省财通供应链金融集团有限公司劳务派遣制人员招聘8人考前自测高频考点模拟试题及答案详解(有一套)
- 2025广东广州翰城房地产开发有限公司招聘工作人员、进入人员模拟试卷附答案详解
- 2025河南中医药大学招聘辅导员、行政岗等13名考前自测高频考点模拟试题及答案详解(考点梳理)
- 2025北京市房山区燕山教育委员会所属事业单位第一批招聘教师30人考前自测高频考点模拟试题及答案详解(名师系列)
- 2025南平延平峡阳镇卫生院招聘驾驶员模拟试卷及完整答案详解
- 2025河北保定市雄安新区雄县事业单位招聘89人模拟试卷(含答案详解)
- 2025广东珠海市第二批拟引进业务骨干人员模拟试卷及答案详解参考
- 第49部分:碳酸根、重碳酸根和氢氧根离子的测定 滴定法(报批稿)
- T/CAAM 0004-2023针刺临床试验中假针刺对照设置与报告指南
- 配网全过程管理
- 立陶宛语儿童文学的语言特点论文
- 民宿的内涵专题课件
- 高职高考数学复习第五章数列5-1数列课件
- 高一必修一英语单词默写表
- GB/T 40816.2-2024工业炉及相关工艺设备能量平衡测试及能效计算方法第2部分:钢加热炉
- 增值税发票清单模板
- 人教版六年级数学上册第一单元测试卷
- 2024年注册安全工程师生产技术押密试题及答案
评论
0/150
提交评论