归并:把两个或多个已经有序的序列合并成一个。
核心操作:把数组内的两个有序序列归并为一个。
例如:

将一个数组分为两个有序序列:

int *B = (int *) malloc(n * sizeof(int)); //辅助数组B
//A[ low...mid ]和A[ mid+1...high]各自有序,将两个部分归并
void Merge(int A[], int low, int mid, int high) {
int i, j, k;
for (k = low; k <= high; k++)
B[k] = A[k];//将A中所有元素复制到B中
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) {
if (B[i] <= B[j])
A[k] = B[i++];//将较小值复制到A中
else
A[k] = B[j++];
}
while (i <= mid)A[k++] = B[i++];
while (j <= high)A[k++] = B[j++];
}
void MergeSort(int A[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;//从中间划分
MergeSort(A, low, mid);//对左半部分归并排序
MergeSort(A, mid + 1, high);//对右半部分归方p序
Merge(A, low, mid, high); //归并
}
}
2路归并的“归并树”:形态上就是一棵倒立的二叉树。
空间复杂度=O(n),来自于辅助数组B.
当左右两边的关键字相同是,优先让靠左边的关键字归并,所有说是稳定的。