ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:265.85KB ,
资源ID:9816930      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9816930.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(排序冒泡选择堆归并.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

排序冒泡选择堆归并.docx

1、排序冒泡选择堆归并课程名称:数据结构 开课实验室:计算中心204室 2011年12 月 日年级、专业、班学号姓名成绩实验项目名称实现排序、冒泡、选择、堆、归并的算法指导教师教师评语教师签名: 年 月 日1、实验内容和目的目的:实现排序、冒泡、选择、堆、归并的算法。内容:撑握排序、冒泡、选择、堆、归并的算法和使用,熟悉并学会运用排序、冒泡、选择、堆、归并的算法内容和相互间的转变等。二、 上机实验环境计算中心204;操作系统:Microsoft Visual C+;软件平台:Microsoft Visual C+三、上机操作方法、步骤打开计算机进入WindowsXP在桌面建立自己的工作目录进入Mi

2、crosoft Visual C+ 6.0文件/新建/文件/C+ Source File/位置/命名输入源程序编译/组建运行。#include#include#define Max 100 /假设文件长度typedef struct /定义记录类型 int key; RecType;typedef RecType SeqListMax+1; /SeqList为顺序表,表中第0个元素作为哨兵int n; /顺序表实际的长度int menu();/-void InsertSort(SeqList R) /直接插入排序法 /对顺序表R中的记录R1n按递增序进行插入排序 int i,j; for(i=

3、2;i=n;i+) /依次插入R2,Rn if(Ri.keyRi-1.key) /若Ri.key大于等于有序区中所有的keys,则Ri留在原位 R0=Ri;j=i-1; /R0是Ri的副本 do /从右向左在有序区R1i-1中查找Ri 的位置 Rj+1=Rj; /将关键字大于Ri.key的记录后移 j-; while(R0.keyRj.key); /当Ri.keyRj.key 是终止 Rj+1=R0; /Ri插入到正确的位置上 /endif/-int Partition(SeqList R,int i,int j) /一次划分函数 /对Rij做一次划分,并返回基准记录的位置 RecType p

4、ivot=Ri; /用第一个记录作为基准 while(ij) /从区间两端交替向中间扫描,直到i=j while(i=pivot.key) /基准记录pivot相当与在位置i上 j-; /从右向左扫描,查找第一个关键字小于pivot.key的记录Rj if(ij) /若找到的Rj.key pivot.key,则 Ri+=Rj; /交换Ri和Rj,交换后i指针加1 while(ij &Ri.key=pivot.key) /基准记录pivot相当与在位置j上 i+; /从左向右扫描,查找第一个关键字小于pivot.key的记录Ri if(i pivot.key,则 Rj-=Ri; /交换Ri和Rj

5、,交换后j指针减1 Ri=pivot; /此时,i=j,基准记录已被最后定位 return i; /返回基准记录的位置/-void QuickSort(SeqList R,int low,int high) /快速排序 /Rlow.high快速排序 int pivotpos; /划分后基准记录的位置 if(lowhigh) /仅当区间长度大于1时才排序 pivotpos=Partition(R,low,high); /对Rlow.high做一次划分,得到基准记录的位置 QuickSort(R,low,pivotpos-1); /对左区间递归排序 QuickSort(R,pivotpos+1,h

6、igh); /对右区间递归排序 /-void SelectSort(SeqList R) /直接选择排序 int i,j,k; for(i=1;in;i+) /做第i趟排序(1in-1) k=i; for(j=i+1;j=n;j+) /在当前无序区Rin中选key最小的记录Rk if(Rj.keyRk.key) k=j; /k记下目前找到的最小关键字所在的位置 if(k!=i) / /交换Ri和Rk R0=Ri; Ri=Rk; Rk=R0; /-冒泡排序- typedef enum FALSE,TRUE Boolean; /FALSE为0,TRUE为1void BubbleSort(SeqLi

7、st R) /自下向上扫描对R做冒泡排序 int i,j; Boolean exchange; /交换标志 for(i=1;i=i;j-) /对当前无序区Rin 自下向上扫描 if(Rj+1.keyRj.key) /两两比较,满足条件交换记录 R0=Rj+1; /R0不是哨兵,仅做暂存单元 Rj+1=Rj; Rj=R0; exchange=TRUE; /发生了交换,故将交换标志置为真 if(! exchange) /本趟排序未发生交换,提前终止算法 return; / endfor(为循环)/-void Heapify( SeqList R,int low,int high)/大根堆调整函数

8、/ 将Rlow.high调整为大根堆,除Rlow外,其余结点均满足堆性质 int large; /large指向调整结点的左、右孩子结点中关键字较大者 RecType temp=Rlow; /暂存调整结点 for(large=2*low; largehigh,则表示Rlow是叶子,调整结束;否则先令large指向Rlow的左孩子 if(largehigh & Rlarge.key=Rlarge.key) /temp始终对应Rlow break; /当前调整结点不小于其孩子结点的关键字,结束调整 Rlow=Rlarge; /相当于交换了Rlow和Rlarge low=large; /令low指向

9、新的调整结点,相当于temp已筛下到large的位置 Rlow=temp; /将被调整结点放入最终位置上/构造大根堆void BuildHeap(SeqList R) /将初始文件R1.n构造为堆 int i; for(i=n/2;i0;i-) Heapify(R,i,n); /将Ri.n调整为大根堆/堆排序void HeapSort(SeqList R) /对R1.n进行堆排序,不妨用R0做暂存单元 int i; BuildHeap(R); /将R1.n构造为初始大根堆 for(i=n;i1;i-) /对当前无序区R1.i进行堆排序,共做n-1趟。 R0=R1; R1=Ri;Ri=R0; /

10、将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); /将R1.i-1重新调整为堆,仅有R1可能违反堆性质。 /-/将两个有序的子序列Rlow.m和Rm+1.high归并成有序的序列Rlow.highvoid Merge(SeqList R,int low,int m,int high) int i=low,j=m+1,p=0; /置初始值 RecType *R1; /R1为局部量 R1=(RecType *)malloc(high-low+1)*sizeof(RecType); /申请空间 while(i=m & j=high) /两个子序列非空时取其小者输出到R1p上 R1p+

11、=(Ri.key=Rj.key)? Ri+:Rj+; while(i=m) /若第一个子序列非空,则复制剩余记录到R1 R1p+=Ri+; while(j=high) /若第二个子序列非空,则复制剩余记录到R1中 R1p+=Rj+; for(p=0,i=low;i=high;p+,i+) Ri=R1p; /归并完成后将结果复制回Rlow.high/-void MergePass(SeqList R,int length)/对R1.n做一趟归并排序 int i; for(i=1;i+2*length-1=n;i=i+2*length) Merge(R,i,i+length-1,i+2*lengt

12、h-1); /归并长度为length的两个相邻的子序列 if(i+length-1n) /尚有一个子序列,其中后一个长度小于length Merge(R,i,i+length-1,n); /归并最后两个子序列 /注意:若in且i+length-1n时,则剩余一个子序列轮空,无须归并/-void MergeSort(SeqList R) /自底向上对R1.n做二路归并排序 int length; for(length=1;lengthn;length*=2)/做lgn趟排序 MergePass(R,length); /有序长度n时终止/-void input_int(SeqList R) /输入

13、顺序表 int i; printf(请输入个数(int):); scanf(%d,&n); printf(请输入一组数据:,n); for(i=1;i=n;i+) scanf(%d,&Ri.key);/-void output_int(SeqList R) /输出顺序表 int i; for(i=1;i=n;i+) printf(%4d,Ri.key); printf(nn);/-void main()/主函数 /int i; SeqList R; input_int(R); while(1) system(cls); int i=menu(); switch (i) case 1: Inse

14、rtSort(R); break; /值为1,直接插入排序 case 2: BubbleSort(R); break; /值为2,冒泡法排序 case 3: QuickSort(R,1,n); break; /值为3,快速排序 case 4: SelectSort(R); break; /值为4,直接选择排序 case 5: HeapSort(R); break; /值为5,堆排序 case 6: MergeSort(R); break; /值为6,归并排序 case 7: exit(0); break; /值为7,结束程序 printf(所选排序的结果:); printf(n); outpu

15、t_int(R); if(i != 7) puts(nn 操作成功! ); system(pause); /-int menu() int n; printf(t- 选择操作 -n); printf(t1: 直接插入排序n); printf(t2: 冒泡法排序n); printf(t3: 快速排序n); printf(t4: 直接选择排序n); printf(t5: 堆排序n); printf(t6: 归并排序n); printf(t7: 退出n); printf(t-n); fflush(stdin); scanf(%d,&n); /输入整数1-7,选择排序方式return n;四、源程序与

16、运行结果:图为输入要排序的一组数据数据输完后,回车出现选择所要的排序法图为选择“直接插入排序法”图为选择“冒泡法排序法”图为选择“快速排序法”图为选择“直接选择排序法”图为选择“堆排序法”图为选择“归并排序法”图为程序成功退出五、上机实践收获和体会: 这几次的上机实践课,让我知道计算机专业需要相当多的实践,而在实践中不但掌握计算机技术(包括程序设计),还要掌握许多其他专业并不“深究”的东西,例如,算法,体系结构,信息管理等等。对于我这个初学者的知识基础较薄弱,对一些应用操作理解起来较为困难,要能从整体概念上较好地理解和把握应用软件,不是仅仅靠几本培训的书籍还买了几本有关专业的书籍,细致地看几遍,然后上机练习几次就可以成功。本专的同学也都在说,学习编程的秘诀是:编程,编程,再编程。我今后会更努力的去学习这门课。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1