I have implemented mergesort in C. Any advice on making it more compact? My merge function seems less than fully optimal.
//mergeSort in C
#include <stdio.h>
#include <stdlib.h>
void merge(int [], int[], int[], int, int);
void mergesort(int[], int);
int main()
{
int unsorted[] = {4, 1, 3, 0, 10, 2, 5, 5};
int size = sizeof(unsorted)/sizeof(int);
mergesort(unsorted, size);
printf("The sorted array is: ");
for(int i = 0; i < size; i++)
{
printf("%d, ", *(unsorted+i));
}
return 0;
}
void merge(int *original, int* first, int* second, int len1, int len2)
{
int i = 0;
int firPtr = 0;
int secPtr = 0;
while(i < (len1+len2))
{
if(firPtr == len1)
{
original[i] = second[secPtr++];
}
else if(secPtr == len2)
{
original[i] = first[firPtr++];
}
else if(first[firPtr] < second[secPtr])
{
original[i] = first[firPtr++];
}
else
{
original[i] = second[secPtr++];
}
i++;
}
}
void mergesort(int unsorted[], int size)
{
if(size <= 1 || unsorted == NULL)
{
return;
}
int *first = (int *)malloc((size/2)*sizeof(int));
int *second = (int *)malloc((size - size/2)*sizeof(int));;
int mid = size/2;
for(int i = 0; i < mid; i++)
{
*(first+i) = *(unsorted+i);
}
//Common Error/Note to self: Make sure when initializing j to
//not 0, the code block truly requires that.
for(int j = (mid); j < size; j++)
{
*(second+(j-mid)) = *(unsorted+j);
}
mergesort(first, mid);
mergesort(second, size - mid);
merge(unsorted, first, second, mid, size - mid);
free(first);
free(second);
}