cnymw#GolangStudy#算法
# 归并排序
## 分治法
分治法是将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:
1. 分解:分解原问题为若干子问题,这些子问题时原问题的规模较小的实例。
2. 解决:解决这些子问题,递归地求解各子问题。若子问题的规模足够小,则直接求解。
3. 合并:合并这些子问题的解成原问题的解。
## 算法
归并排序算法完全遵循分治模式,直观上其操作如下:
1. 分解:分解待排序的 n 个元素的序列成各具 n/2 个元素的两个子序列。
2. 解决:使用归并排序递归地排序两个子序列。
3. 合并:合并两个已排序的子序列以产生已排序的答案。
## 实现
### 分解
过程 MERGE-SORT(A,p,r) 排序子数组 A[p..r] 中的元素。若 p>=r ,则该子数组最多有一个元素,所以已经排好序。
否则,分解步骤简单地计算一个下标 q,将 A[p..r] 分成两个子数组 A[p..q] 和 A[q+1..r]
过程 MERGE-SORT 目的在于将数组 A 递归地对半分解成两个子序列,直到子序列分成一个元素为止。
分解的过程如下图所示:
![序列](https://cnymw.github.io/GolangStudy/docs/img/�