归并排序算法实现的理解与教学过程.docVIP

归并排序算法实现的理解与教学过程.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
归并排序算法实现的理解与教学过程   摘 要:本文阐述了应用递归方法实现归并排序算法的详细理解过程,并在教学过程中实践了借助于归并式递归图形加强理解与教学。   关键词:归并排序;递归;教学   中图分类号:T393 文献标识码:B   文章编号:1672-5913(2007)18-0066-03      1引言      从归并排序的概念上进行分析,该算法的思想比较容易理解,并且也能够直观的感知其实质是利用存储空间的归并。在实现的过程中,可以有多种方法,画出归并过程示意图后,随即可以得出其算法的代码。但是我们在利用递归思想实现归并排序的教学过程中,一定要让学生分清是用递归还是用回归进行的归并,画出图形区分这两种不同的归并过程。通过这一环节,我们不但能够理解稳定的归并排序,而且还让学生认清递归和回归是解决这一问题两种不同的操作过程。      2归并排序的概念理解并实现      当初次理解归并概念的时候,我们可以列举下列一组数据的归并过程。   例如:70 83 100 65 10 32 7 65 9   第一次:[70 83][65 100][10 32][7 65][9]   第二次:[65 70 83 100][7 10 32 65][9]   第三次:[7 10 32 65 65 70 83 100][9]   第四次:[7 9 10 32 65 65 70 83 100]   具体程序代码如下:   函数:void merge(int e[], int n)   形参说明:e是已知待排序的数组,n是数组中元素的个数,下标从0开始。   void merge(int e[], int n)   { int *p=(int*)malloc(sizeof(int)*n);/*开辟一块实现交替归并空间 */    int len=1,f=0; /*len为归并单元宽度,f是一个标识,实现交替归并*/    while(lenn) /*当归并单元达到或者超过序列长度时,归并结束*/    {    if(f==0) merge_pass(e,p,n,len);   /*交替进行归并*/    elsemerge_pass(p,e,n,len);    len*=2; /*扩大归并单元宽度*/    f=1-f; }    if(f) /*将最终结果存放的指定数据域中*/    for(f=0;fn;f++) e[f]=p[f];    free(p);   }   void merge_pass(int e[],int a[],int n,int len)   { int f_s, s_end; /* f_s存放即将归并的第一个单元起始下标*/   f_s=0; /*s_end 存放即将归的并第二个单元末下标*/    while(f_s+lenn)    {s_end=f_s+2*len-1;    if(s_end=n) s_end=n-1; /*确定真正末下标位置*/    merge_step(e, a, f_s, f_s+len-1, s_end);    /*实现将两个单元合并*/    f_s=s_end+1;    }    if(f_sn) /*没有归并的部分复制过去,保证交替归并的正确进行*/    for(; f_sn; f_s++)    a[f_s]=e[f_s];   }      voidmerge_step(int e[], int a[],int s, int m, int n)   { /*实现将两部分单元归并,m为分界点下标,即为第一单元的末下标*/   int i,j,k;   k=i=s; j=m+1;   while(i=mj=n)    if(e[i]=e[j]) a[k++]=e[i++];    else a[k++]=e[j++];    while(i=m) a[k++]=e[i++];    while(j=n) a[k++]=e[j++];   }   分析:利用最基本的方法实现归并排序,我们需要利用三个函数,在实现的过程中,程序的可读较高,但是在程序执行的过程中,函数之间需要频繁的进行嵌套调用,数据的交替归并也显得比较麻烦,所以在正确的实现归并算法的基础上,我们引入了递归的方法。      3递归二路归并排序      利用递归的思想可以掩盖上一方法的频繁嵌套调用,而利用递归的真正目的还可以解决上一方法中数据的交替归并,其方法是它将数组分解成两部分a[l],…,a[m]和a[m+1],…,a[r]来排序数组a[l],…,a[r]。这两个子

文档评论(0)

heroliuguan + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8073070133000003

1亿VIP精品文档

相关文档