思路
代码中用了递归思路和非递归思路两种函数实现二路归并
递归思路:下图
非递归思路:下图中的合并部分
以上图片来源为:B站某up主,如有侵权请联系我删除
代码
// 作用为合并两个相邻的有序子数组
// left right都为下标
void MergeList(int A[], int left_low, int left_high, int right_low, int right_high)
{
int *Result = A + left_low;
int *Temp = (int *)malloc(sizeof(int) * (right_high - left_low + 1));
int i = 0;
while (left_low <= left_high && right_low <= right_high)
Temp[i++] = A[left_low] < A[right_low] ? A[left_low++] : A[right_low++];
if (left_low > left_high)
while (right_low <= right_high)
Temp[i++] = A[right_low++];
if (right_low > right_high)
while (left_low <= left_high)
Temp[i++] = A[left_low++];
for (int j = 0; j < i; j++)
Result[j] = Temp[j];
}
// low为0,high为n-1
// low和high为归并排序的下标
void MergeSort_RECURSION(int A[], int low, int high)
{
if (low >= high)
return;
int mid = (low + high) / 2;
MergeSort_RECURSION(A, low, mid);
MergeSort_RECURSION(A, mid + 1, high);
MergeList(A, low, mid, mid + 1, high);
}
// n为数组个数
void MergeSort_NO_RECURSION(int A[], int n)
{
int x = 2;
while (x / 2 + 1 <= n)
{
for (int i = 0; i < n; i += x)
{
int mid = x / 2;
MergeList(A, i, i + mid - 1, i + mid, min(n - 1, i + x - 1));
}
x *= 2;
}
}
int main()
{
int A[] = {8, 7, 5, 6, 1, 3, 2, 9, 10, 234, 121, 4, 2324, 98};
int B[] = {8, 7, 5, 6, 1, 3, 2, 9, 10, 234, 121, 4, 2324, 98};
MergeSort_NO_RECURSION(A, 14);
for (int i = 0; i < 14; i++)
cout << A[i] << " ";
cout << endl;
MergeSort_RECURSION(B, 0, 13);
for (int i = 0; i < 14; i++)
cout << B[i] << " ";
return 0;
}