自然归并排序---实验报告.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自然归并排序---实验报告

湖南涉外经济学院 计算机科学与技术专业 《算法设计与分析》课程 自然归并排序 实 验 报 告 班级: 学号: 姓名: 教师: 成绩: 2012年5月 【实验目的】 1 掌握分治策略,自然归并以及基本的排序算法。比较自然归并排序和普通的顺序,冒泡以及选择排序的各自的特点。 2 利用分治策略的思想实现自然归并排序 3 分析实验结果,总结算法的时间和空间复杂度。 【系统环境】 Windows7 旗舰版 平台 【实验工具】 VC++6.0英文企业版 【问题描述】 描述: 随机生成一个长度为n的数组,n由键盘输入(10=n=1000)。对随机生成的自然数数组元素按小到大进行若干个分段,每段的元素都行一个自然地有序序列,然后利用分治策略将每小段的元素进行合并,合并后的数组元素依然为一个有序序列。 例: n=10 随机序列为:5 1 4 2 3 0 8 9 6 7,正确输出为:0 1 2 3 4 5 6 7 8 9,它的自然有序分段的起始下标值为:0 1 3 5 8。 【实验原理】 原理:对于一个给定的数组a,通常会有长度大于1的有序子序列,我们称之为自然有序子序列。自然归并排序是找出给定数组中的自然子序列,将其开始的下标位置保存起来,然后对两个子序列之间进行插入排序形成一个大的有序子序列,直到整个数组排序完成。 思路:首先定义一个全局变量n,控制数组的长度。在给定数组长度的前提,考虑数组子序列数最遭的情况就是整个数组对我们要求的序列刚好成一个反序列,即子序列的个数就是数组元素的个数。所以定义两个长度为n的数组a、b,一个保存数组元素啊a[i],另一个保存自然子序列的起始下标值b[i]。 得到起始下标后我们的排序循环应该为:b[i]≤j≤b[i+1]-1,其中当b[i]为最后一个的子序列的起始下标是,我们的循环应给为:b[i]≤j≤n。每次循环都将相当前的子序列个数进行分治,知道形成两个相对时才进行排序。 方法:利用函数的相互调用和函数的递归调用实现程序的最终实现,一个主函数,三个子函数。在主函数中只是单独的调用了将数组进行子序列划分的子函数zgb,然后以zgb为入口进行分治策略函数zgb1的调用,再在zgb1中调用zgb1函数本身和调用进行排序的函数zgb2。 例:有数组a={4,8,3,7,1,5,6,2,0,9},则自然有序子序列有{4,8},{3,7},{1,5,6},{2}和{0,9}。用一次对数组的扫描就可以找出这些子序列的起始下标位置为{0,2,4,7,8,}。对上面子序列进行一次归并排序后得到的子序列为{3,4,7,8},{1,5,6},{0,2,9},排序后的下标起始位置为{0,4,7}。如此的重复上面的排序动作,直到最后整个数组排序完成,即下标起始位置的值只剩下0号位置后退出。 【源程序代码】 #include stdio.h //输入输出的库函数 #include stdlib.h //自然生成数据的库函数 int n; //全局变量,数组的长度 //函数的定义 void zgb(int *p); //自然分组的规划 void zgb1(int x,int y,int *q,int *p,int m); //递归实现的分治策略 void zgb2(int x,int y,int z,int *p); //排序函数 void main() //主函数 { int i,m; char ch=13; //变量的定义 while(1) //主菜单选择的循环 { if(ch==13); //判断控制换行 system(cls); //清屏 printf(------------请选择:--------------\n1、运行程序。\n0、退出程序。\n); //主菜单 scanf(%d,m); //接受菜单选择值 system(cls); //清屏 if(!m) //判断程序是否执行。 exit(0); //如果m的值非1,则执行退出 printf(请输入数列的长度n。\n); //提示语句 scanf(%d,n); //从键盘输入一个值给n,规定数组的长度 int *a=new int[n]; //定义原数据数组 printf(随机数列如下:\n); for(i=0;in;i++) printf(%4d,a[i]=rand()%100); //动态生成数组的数据 printf(\n); zgb(a); //调用自然分组的函数 printf(自然

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档