I was implementing Merge sort in C++ and I came across an implementation on GeeksforGeeks. In my implementation, I calculated and passed the size of the array on each call. The implementation I saw on GFG was done by passing start and end indices on each call. This was the implementation on most of the websites.
Which method is preferred and why? Does the implementation on GFG better than mine.
GFG Implementation:
void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
/* create temp arrays */
int L[n1], R[n2];
/* Copy data to temp arrays L[] and R[] */
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
/* Copy the remaining elements of L[], if there
are any */
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
/* Copy the remaining elements of R[], if there
are any */
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(int arr[], int l, int r)
{
if (l < r) {
// Same as (l+r)/2, but avoids overflow for
// large l and h
int m = l + (r - l) / 2;
// Sort first and second halves
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
My Implementation:
void Merge(int *L, int *R, int nL, int nR, int *A)
{
int i, j, k;
i = j = k = 0;
while (i < nL && j < nR)
{
if (L[i] <= R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
k++;
}
while (i < nL)
{
A[k] = L[i];
i++;
k++;
}
while (j < nR)
{
A[k] = R[j];
j++;
k++;
}
}
void MergeSort(int *A, int n)
{
int mid = n / 2;
if (n < 2)
{
return;
}
int left[mid], right[n - mid];
for (int i = 0; i < mid; i++)
{
left[i] = A[i];
}
for (int i = mid; i < n ;i++)
{
right[i-mid] = A[i];
}
int nL = sizeof(left) / sizeof(int);
int nR = sizeof(right) / sizeof(int);
MergeSort(left, nL);
MergeSort(right, nR);
Merge(left, right, nL, nR, A);
}