在我们之前的算法设计课程中,我们学习了合并排序与自底向上合并排序算法,今天我们就来分析一下这个算法。
合并算法
无论是合并排序还是自底向上合并排序,他的实现都基于一个重要的算法:合并算法(merge算法)。Merge算法实现的功能是将两个数组合并成为一个数组,我们可以定义一个结果数组b,再分别定义两个索引p1、p2,分别指向两
个数组的头,将p1、p2指向的两个数进行比较,并将较小的那一个放入数组b
Merge算法的伪码如下:
1 | merge(p, q, r, a[]): |
自底向上合并排序算法
自底向上合并算法顾名思义,就是从最底部开始,将数组元素两两合并,再将合并后的数组两两合并,直到重新合并成一个完整的数组。对于数组a = {9,4,5,2,1,7,4,6}的合并过程可以用如下图来表示:
完整代码(java)
1 | //自底向上合并排序 |
合并排序算法
合并排序算法与自底向上合并排序十分相似(废话!),只不过与自底向上合并排序不同的是,合并排序是一个自顶向下的过程。我们可以将一整个数组拆分成两个数组,将其中的一个数组再进行拆分,直到拆分成两个单个元素,再将他们合并…重复此过程直到整个数组都重新合并完毕。
对于数组a[]={9,4,5,2,1,7,4,6}的合并排序可以用如下图示表示:
合并排序算法伪代码如下:
1 | mergesort(low, high, a[]): |
完整代码(Java)
1 | //合并排序算法 |
