#include "stdafx.h"
#include "mergeSort.h"
void merge(int* pSource, int l1, int r1, int l2, int r2, int* pTarget);
void mergeRecursion(int* pSource, int l, int r, int* pTarget);
void mergeSort(int* pSource, int len)
{
int* pTarget = new int[len];
memcpy(pTarget, pSource, len*sizeof(int));
mergeRecursion(pTarget, 0, len - 1, pSource);
delete[]pTarget;
}
void mergeRecursion(int* pSource, int l, int r, int* pTarget)
{
int lA, rA, lB, rB;
if (l != r)
{
lA = l;
rA = (l + r) / 2;
lB = rA + 1;
rB = r;
mergeRecursion(pTarget, lA, rA, pSource);
mergeRecursion(pTarget, lB, rB, pSource);
merge(pSource, lA, rA, lB, rB, pTarget);
}
}
void merge(int* pSource, int l1, int r1, int l2, int r2, int* pTarget)
{
int a = l1, b = l2, i = l1;
int x = pSource[r1] > pSource[r2] ? pSource[r2] : pSource[r1];
while (true)
{
if (pSource[a] <= pSource[b])
{
pTarget[i] = pSource[a];
a++;
}
else
{
pTarget[i] = pSource[b];
b++;
}
if (pTarget[i] == x)
{
i++;
break;
}
i++;
}
if (a > r1)
{
while (b <= r2){
pTarget[i] = pSource[b];
b++;
i++;
}
}
else{
while (a <= r1){
pTarget[i] = pSource[a];
a++;
i++;
}
}
}