#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <math.h>
#include <string.h>
#define NUM_TO_CALC 33
//p:start index of A1; q: end index of A1; q+1:start index of A2; r:end index of A2
int merge(int *A, int p, int q, int r)
{
int A1Index = p;
int A2Index = q + 1;
int TotalCnt = r - p + 1;
int dstA[TotalCnt];
for(int i = 0; i < TotalCnt; i++ )
{
if(A1Index > q)
{
dstA[i] = A[A2Index];
A2Index++;
continue;
}
if(A2Index > r)
{
dstA[i] = A[A1Index];
A1Index++;
continue;
}
if(A[A1Index] <= A[A2Index])
{
dstA[i] = A[A1Index];
A1Index++;
}
else
{
dstA[i] = A[A2Index];
A2Index++;
}
}
memcpy(A, dstA, TotalCnt*sizeof(int));
return 0;
}
int mergSort(int *A, int num)
{
if(num <= 1) return 0;
mergSort(A, num/2);
mergSort(A+num/2, num -num/2);
merge(A, 0, num/2-1, num - 1);
#if 0
for(int i = 0; i < num; i++)
printf(" %d ", A[i]);
printf("\n***********************\n");
#endif
return 0;
}
int main()
{
int A[NUM_TO_CALC];
for(int i = 0; i < NUM_TO_CALC; i++)
{
int randTmp = rand();
A[i] = randTmp%NUM_TO_CALC;
}
for(int i = 0; i < NUM_TO_CALC; i++)
{
printf("%d ", A[i]);
}
printf("\n*******************\n");
mergSort(A, NUM_TO_CALC);
for(int i = 0; i < NUM_TO_CALC; i++)
{
printf("%d ", A[i]);
}
printf("\n*******************\n");
return 0;
}