问题:二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
分析:二分归并排序,本质上是一种归并排序算法,不断将一个数组分为左右两部分,直到不可分,然后再将两两合并直到完整。
1.分解n个元素直到组成n/2组数组。
2.使用归并排序递归排序两个子序列。
3.合并已经排序的子序列。
核心代码如下
void Merge(int A[], int p, int q, int r)
{
int* L, * R, x, y;
x = q - p + 1, y = r - q;
L = (int*)malloc(sizeof(int) * x);
R = (int*)malloc(sizeof(int) * y);
int i, j;
for (i = 0; i < x; i++)
L[i] = A[i + p];
for (j = 0; j < y; j++)
R[j] = A[j + q + 1];
i = j = 0;
int k = p;
while (i < x && j < y)
{
if (L[i] <= R[j])
A[k++] = L[i++];
else
A[k++] = R[j++];
}
while (i < x)
A[k++] = L[i++];
while (j < y)
A[k++] = R[j++];
free(L);
free(R);
}
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);// 调用Merge函数,合并两组数据
}
}
复杂度log2n;