- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)