1.问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2.解析
1、分治思想
将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:
(1) 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。
(2) 解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
(3) 合并这些子问题的解成原问题的解。
2、归并算法
归并排序算法完全遵循分治模式。其操作如下:
(1) 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
(2) 解决:使用归并排序递归地排序两个子序列。
(3) 合并:合并两个已排序的子序列以产生排序的答案。
当待排序的序列长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序。
并排序算法的关键操作是“合并”步骤中两个已排序序列的合并。通过调用一个辅助过程MERGE(A,p,q,r)来完成合并,其中A是一个数组,p、q和r是数组下标,满足p≤q<r。该过程假设子数组A[p…q]和A[q+1…r]都已排好序。它合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p…r]。
图示:
3. 设计
伪代码
算法:Mergesort(A[0..n-1])
//递归调用mergesort来对数组A[0..n-1])排序
//输入:一个可排序数组A[0..n-1]
//输出:非降序排列的数组A[0..n-1]
if n>1
copy A[0..[n/2]-1] to B[0..[n/2] – 1]
copy A[[n/2]..n-1] to C[0..[n/2]-1]
Mergesort(B[0..[n/2] – 1])
Mergesort(B[0..[n/2] – 1])
Mergesort(C[0..[n/2] – 1])
Merge(B,C,A)
算法:Merge(B[0..p-1], C[0..q-1], A[0..p+q-1])
//将两个有序数组合并为一个有序数组
//输入:两个有序数组B[0..p-1]和C[0..q-1]
//输出:A[0..p+q-1]中已经有序存放了
i←0; j←0; k←0
while i<p and j <q do
if B[i] ≤C[j]
A[k] ←B[i]; i←i+1
else A[k] ←C[j];j←j+1
k←k+1
if i = p
copy C[j..q-1] to A[k..p+q-1]
else
copy B[i..p-1] to A[k..p+q-1]
实验截图;
4. 分析
5. 源代码地址
https://github.com/Lin02993/Algorithm-Analysis-and-Practice-on-the-job