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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(数据结构与算法排序资料.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

数据结构与算法排序资料.docx

1、数据结构与算法排序资料数据结构与算法实验报告班级学号姓 名实验周次实验日期xxxxxxxxxxxxxxxxx2015年10月 28 日实验02:排序一、实验目的1掌握各种常用排序方法的特点及其存储的方式。2掌握各种排序算法的要求、方法和过程。3了解各种排序算法效率的分析和计算方法。二、实验内容以Sort01(ReferenceParameter).cpp或者Sort02(PointerParameter).cpp为基础,实现如图2-1程序界面所示的常用排序算法。注意:功能4(快速排序)、功能6(堆排序)和功能7(归并排序)是需要完成的部分;功能5(希尔排序)因为本学期采用的课本上没有提及,所以

2、直接将答案给出了,大家只需看懂理解即可,其它和排序无关的功能项均已给出实现代码,大家无需更改。三、实验要求1、Sort01(ReferenceParameter).cpp和Sort02(PointerParameter).cpp选做其中一题即可(两题代码的思路完全一致,只有实现时参数传递方式的差别)。2、演示程序SortDemo.exe中的所有排序均是升序排列,但完成本实验时,学号为单号的同学:排序时要求升序排列;学号为双号的:排序时要求降序排列。3、实验报告电子稿和打印稿及其它提交方面的要求同实验01。四、运行结果图2-1 随机产生一批整数并快速排序图2-2 随机排列表中元素并希尔排序图2-

3、3 随机排列表中元素并希尔排序图2-4 随机排列表中元素并归并排序五、参考程序#include stdio.h#include stdlib.h#include time.h#define MAX 50/ 顺序表结构体typedef struct int sMAX; / 存放一批随机整数,数组大小MAX不能扩充 int length; / 当前表中元素的个数 SeqList;/ 功能菜单void menu() printf(nt*排-序*n); printf(t* 1 随机产生一批整数 *n); printf(t* 2 手动输入一批整数 *n); printf(t* 3 将表中数据随机化 *n

4、); printf(t* 4 快速排序 *n); printf(t* 5 希尔排序 *n); printf(t* 6 堆排序 *n); printf(t* 7 归并排序 *n); printf(t* 8 依次显示表中所有数据 *n); printf(t* 0 退出程序 *n); printf(t*n);/* 初始化一个空的顺序表 */SeqList *init() / 开辟顺序表空间 SeqList *p=(SeqList *)malloc(sizeof(SeqList); / 设置顺序表的初始长度为0 p-length=0; / 返回整个顺序表的(起始)地址 return p;/* 随机产生

5、一批整数到线性表中 */void randGen(SeqList *p) int num, i; printf(请输入元素个数(=%d):n, MAX-1); scanf(%d, &num); srand(int)time(0); if(num = MAX) / 随机产生num个整数存入顺序表中(从1号单元开始存放,0号单元留作“哨兵”) for(i=1; isi=1+(int)(100.0*rand()/(RAND_MAX+1.0); p-length=num; printf(顺序表中已成功放入%d个整数!n, num); else printf(顺序表空间不够,请重新输入元素个数!n);/

6、* 手动输入一批整数到线性表中 */void manInput(SeqList *p) int num, i; printf(请输入元素个数(=%d):n, MAX-1); scanf(%d, &num); printf(请输入%d个整数:n, num); if(num = MAX-1) / 输入num个整数存入顺序表中(从1号单元开始存放,0号单元留作“哨兵”) for(i=1; isi); p-length=num; printf(顺序表中已成功输入%d个整数!n, num); else printf(顺序表空间不够,请重新输入元素个数!n);/* 将顺序表中现有元素打乱为随机排列 */v

7、oid randomizeList(SeqList *p) int i, selectLoc, tmp; / 借助选择法排序的思想,每次从尚未挑选的序列中随机挑选一个元素, / 将随机选中的元素交换到尚未选中元素序列的最前面或最后面。 for(i=1; ilength; i+) / 产生一个属于区间i,p-length的随机数selectLoc selectLoc = i+(int)(p-length-i)*rand()/(RAND_MAX+1.0); if(selectLoc != i) tmp = p-si; p-si = p-sselectLoc; p-sselectLoc = tmp;

8、 / 反过来再来一遍 for(i=p-length; i1; i-) / 产生一个属于区间0,i的随机数selectLoc selectLoc = 1+(int)(i*rand()/(RAND_MAX+1.0); if(selectLoc != i) tmp = p-si; p-si = p-sselectLoc; p-sselectLoc = tmp; printf(顺序表中的元素已经重新随机排列!n);/ 快速排序划分函数int Partition(int R, int low, int high) /对记录子序列Rlow.high进行一趟快速排序,并返回枢轴记录所在位置 int pivo

9、tkey; R0=Rlow; pivotkey=Rlow; while(lowhigh) /从表的两端交替向中间扫描 while(low=pivotkey) -high; if(lowhigh) Rlow+=Rhigh; /将比枢轴记录小的记录移到低端 while(lowhigh & Rlow=pivotkey) +low; if(lowhigh) Rhigh-=Rlow; /将比枢轴记录大的记录移到高端 Rlow=R0; return low; / 最后返回枢轴的位置(下标)/ 快速排序递归函数void QSort(int R, int s, int t) / 对记录Rs.t进行快速排序 i

10、nt pivotloc; if(ss,1,p-length); printf(已采用快速排序算法成功排序!n);/ 一趟希尔插入排序(实质为直接插入排序的变形)void shellInsert(SeqList *p, int dk) int i, j; for(i=dk+1; ilength; +i) if(p-si si-dk) p-s0 = p-si; / 设置插入排序的“哨兵” for(j=i-dk; j0 & p-s0 sj; j-=dk) p-sj+dk = p-sj; p-sj+dk = p-s0; /* 希尔排序(缩小增量排序),假设增量设置为5,3,1 */void shell

11、Sort(SeqList *p, int dlta, int t) int k; / 按增量序列dlta0.t-1对顺序表中的元素作希尔排序 for(k=0; ksm.n区间元素重新调整为堆的函数void heapAdjust(SeqList *p, int m, int n) / 使得p-sm.n成为大堆 int j,rc; rc=p-sm; for(j=2*m; j=n; j*=2) if(jsj sj+1) +j; if(rc=p-sj) break; p-sm=p-sj; m=j; p-sm=rc;/* 堆排序 */void heapSort(SeqList *p) / 对顺序表p进行

12、堆排序 int rc,i; for(i=p-length/2; i0; -i) heapAdjust(p,i,p-length); for(i=p-length; i1; -i) rc=p-s1; p-s1=p-si; p-si=rc; heapAdjust(p,1,i-1); printf(已采用堆排序算法成功排序!n); / 归并排序合并有序表/ 将有序的SR1.m和SRm+1.n归并为有序的TRi.nvoid Merge(int SR, int TR, int i, int m, int n) / 将有序的SRi.m和SRm+1.n归并为有序的TRi.n int k,j; for(j=m

13、+1,k=i; i=m & j=n; +k) /将SR中记录由小到大的并入TR if(SRi=SRj) TRk=SRi+; else TRk=SRj+; while(i=m) TRk+=SRi+; /将剩余的SRi.m复制到TR while(jlength+1)*sizeof(int); / 调用递归函数作归并排序 Msort(p-s, auxSpa, p-s, 1, p-length); / 释放辅助空间 free(auxSpa); printf(已采用归并排序算法成功排序!n);/* 显示表中所有数据 */void showAll(SeqList *p) int i; if(p-lengt

14、h 0) printf(当前表中的元素个数为%d,依次如下:n, p-length); for(i=1; ilength; i+) printf(%d , p-si); printf(n); else printf(当前顺序表为空!n);void main() int choice=-1; SeqList *plist; int incArr=5,3,1; / 将希尔排序的增量设置为5,3,1 plist=init(); while(1) menu(); fflush(stdin); printf(t请选择一个菜单项:); scanf(%d, &choice); switch(choice)

15、case 1: / 随机产生一组整数放入表中 randGen(plist); showAll(plist); break; case 2: / 手动输入一批整数放入表中 manInput(plist); showAll(plist); break; case 3: / 将现有表中数据随机化排列 randomizeList(plist); showAll(plist); break; case 4: / 快速排序 quickSort(plist); showAll(plist); break; case 5: / 希尔排序(增量为3个,依次为5,3,1) shellSort(plist, incArr, 3); showAll(plist); break; case 6: / 堆排序 heapSort(plist); showAll(plist); break; case 7: / 归并排序 mergeSort(plist); showAll(plist); break; case 8: / 按顺序显示表中所有数据 showAll(plist); break; case 0: exit(0); break; default: printf(t您输入的菜单项不存在,请重新选择!n); choice=-1; / 表示未选择菜单项 或者 菜单项选择错误

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2