算法设计实训:递归与非递归二路归并排序及最长公共子序列

需积分: 0 1 下载量 154 浏览量 更新于2024-08-03 收藏 17KB DOCX 举报
"本资源包含了三个不同的编程题目,分别是递归二路归并排序、非递归二路归并排序和最长公共子序列的实现。这些题目是算法设计期末实训的一部分,适合K12阶段的学生学习和练习。" 首先,我们来详细探讨第一个算法——递归二路归并排序。这是一种基于分治策略的排序算法,它将大问题分解成小问题来解决。在给定的代码中,`merge_sort()` 函数采用递归的方式对数组进行排序。它首先检查是否已达到基本情况(即数组只有一个或没有元素),然后将数组分成两半,并分别对它们进行排序。接着,通过`sort()`函数对两个已排序的子数组进行合并。在这个过程中,为了测试输出排序过程,增加了一个`cnt`变量,当调用次数超过3次时停止输出。`main()`函数负责读取数组的大小和元素,然后调用`merge_sort()`进行排序。 第二个算法是非递归的二路归并排序。这个实现方法不依赖于递归,而是使用了循环和固定步长来实现分治。代码中定义了一个数组`w`,包含三个步长(2, 4, 8),每次循环按这些步长对数组进行部分排序,最后再将整个数组输出。这种方法虽然不是标准的二路归并排序,但它展示了如何通过迭代而非递归来处理相同的问题。 最后一个算法是求解两个字符串的最长公共子序列。这是一个经典的动态规划问题,目标是找到两个字符串中长度最长的共同子序列,而不需要保持子序列在原序列中的相对顺序。代码中定义了一个二维数组`dp`用于存储中间结果,`dp[i][j]`表示字符串`s1`的前`i`个字符和`s2`的前`j`个字符的最长公共子序列的长度。通过两层循环,分别遍历两个字符串的所有字符,更新`dp`数组。当遇到匹配的字符时,`dp[i][j]`取当前值和左上角元素值加1的最大值。最后,`dp[i-1][j-1]`即为两个字符串的最长公共子序列的长度。 总结这三个算法,我们可以看到它们都是在处理数据结构和算法问题,涉及到排序(二路归并)和序列比较(最长公共子序列)。这些基础知识对于计算机科学的学习至关重要,特别是在K12教育阶段,理解和掌握这些概念有助于培养学生的逻辑思维能力和解决问题的能力。