小号苏拉玛声望怎么刷:9.8.3 非递归实现归并排序(2)
来源:百度文库 编辑:中财网 时间:2024/05/02 18:28:51
9.8.3 非递归实现归并排序(2)
1.程序执行。我们第一次调用“MergePass(L.r,TR,k,L.length);”,此时L.r是初始无序状态,TR为新申请的空数组,k=1.length=9。
2.第5~9行,循环的目的就两两归并,因s=1,n‐2×s+1=8,为什么循环i从1到8,而不是9呢?就是因为两两归并,最终9条记录定会剩下来,无法归并。
3.第7行,Merge函数我们前面已经详细讲过,此时i=1,i+s‐1=1,i+2×s‐1=2。也就是说,我们将SR(即L.r)中的第一个和第二个记录归并到TR中,然后第8行,i=i+2×s=3,再循环,我们就是将第三个和第四个记录归并到TR中,一直到第七和第八个记录完成归并,如图9‐8‐14所示。
(点击查看大图)图9-8-144.第10~14行,主要是处理最后的尾数,第11行是说将最后剩下的多个记录归并到TR中。不过由于i=9,n‐s+1=9,因此执行第13~14行,将20放入到TR数组的最后。(点击查看大图)图9-8-155.再次调用MergePass时,s=2,第5~9行的循环,由第8行的i=i+2×s可知,此时i就是以4为增量进行循环了,也就是说,是将两个有两个记录的有序序列进行归并为四个记录的有序序列。最终再将最后剩下的第九条记录“20”插入TR。
(点击查看大图)图9-8-16
6.后面的类似,略。
非递归的迭代方法,避免了递归时深度为log2n的栈空间,空间只是用到申请归并临时用的TR数组,因此空间复杂度为O(n),并且避免递归也在时间性能上有一定的提升,应该说,使用归并排序时,尽量考虑用非递归方法。9
注:9关于归并排序算法更详细讲解,请参考《算法导论》第一部分第2章“算法入门”的2.3.1节“分治法”的内容。
归并排序法
实现递归和非递归转换的基本思想是什么?
修改归并排序的程序
数据结构 谁会用pascal实现 用后序的顺序创建一个二*树,并对此二*树进行遍历(递归or非递归均可)
递归排序算出1,1,2,3,5,8……的第30个数?
急:请教关于C++递归实现N数排序问题(不知道为什么溢出了)
谁知道空间复杂度为o(1)的归并排序算法?
这个归并排序为什么在DEV下运行错误?
c++里面的归并排序法怎么写?
ack问题非递归算法
谁有八皇后非递归算法?
二级C公共基础题中的插入排序,选择排序,快速排序,归并排序各有什么特点,具体是怎么回事?
对照递归算法和非递归算法的优缺点。
所有用递归算法的能不能都用非递归算法实现?
请问如何用ASP实现记录按1、2、3这样排序??
如何实现随机排序???
C语言汉诺塔 非递归算法
插入,选择,交换,分配,归并排序法那个对文件的初始状态作要求?
谁帮我解决下归并排序程序的问题///TC环境
一个递归算法的实现问题
c语言 用递归法 对字符串进行排序
气泡排序和选择排序用链表实现
(急)ASP中如何实现栏目排序调整?
用指针实现冒泡排序