归并排序采用了分治策略:即将原问题划分成n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后再合并结果,就得到原问题的解。
归并排序算法步骤:
- 分解:将n个元素分成个含n/2个元素的子序列
- 解决:用归并排序算法对两个子序列递归的排序
- 归并:将两个子序列的结果归并的到最终结果。
下面一个具体的执行过程:
当子问题执行完之后,合并子结果得到总结果。
Java代码:
public static void merge(int[] a, int p, int q, int r) {
int num1 = q - p + 1;
int num2 = r - q;
int[] a1 = new int[num1];
int[] a2 = new int[num2];
for(int i = 0; i < num1; i++) {
a1[i] = a[p+i];
}
for(int i = 0; i < num2; i++) {
a2[i] = a[q+i+1];
}
int i = 0, j = 0, k = p;
while(i < num1 && j < num2)
{
if(a1[i] <= a2[j]) {
a[k++] = a1[i++];
}
else {
a[k++] = a2[j++];
}
}
while(i < num1) {
a[k++] = a1[i++];
}
while(j < num2) {
a[k++] = a2[j++];
}
}
public static void mergeSort(int[] a, int p, int r) {
if(p < r) {
int q = (p+r) / 2;
mergeSort(a, p, q);
mergeSort(a, q+1, r);
merge(a, p, q, r);
}
}