I have learned Merge Sort algorithm in C++ recently and have come across 2 different ways by which it is implemented in tutorials.
1st way:
void merge(int arr[], int low, int mid, int high) {
const int n1 = (mid - low + 1);
const int n2 = (high - mid);
int *a = new int[n1], *b = new int[n2];//dynamically allocated because of MSVC compiler
for (int i = 0; i < n1; i++)
a[i] = arr[low + i];
for (int i = 0; i < n2; i++)
b[i] = arr[mid + 1 + i];
int i = 0, j = 0, k = low;
while (i < n1 && j < n2) {
if (a[i] < b[j]) {
arr[k] = a[i];
i++;
} else {
arr[k] = b[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = a[i];
k++, i++;
}
while (j < n2) {
arr[k] = b[j];
k++, j++;
}
delete[] a;
delete[] b;
}
void mergeSort(int arr[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
int main() {
int arr[] = { 9, 14, 4, 8, 6, 7, 5, 2, 1 };
unsigned size = sizeof(arr) / sizeof(arr[0]);
printArray(arr, size);
mergeSort(arr, 0, size - 1);
printArray(arr, size);
return 0;
}
2nd way:
Using temp
array passed in the arguments.
void merge(int arr[], int temp[], int low, int mid, int high) {
int i = low, k = low, j = mid + 1;
while (i <= mid && j <= high) {
if (arr[i] < arr[j]) {
temp[k] = arr[i];
i++;
} else {
temp[k] = arr[j];
j++;
}
k++;
}
while (i <= mid) {
temp[k] = arr[i];
k++, i++;
}
while (j <= high) {
temp[k] = arr[j];
k++, j++;
}
for (int i = low; i <= high; i++)
arr[i] = temp[i];
}
void mergeSort(int arr[], int temp[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mergeSort(arr, temp, start, mid);
mergeSort(arr, temp, mid + 1, end);
merge(arr, temp, start, mid, end);
}
}
int main() {
int arr[] = { 9, 14, 4, 8, 6, 7, 5, 2, 1 };
unsigned size = sizeof(arr) / sizeof(arr[0]);
int *buffer = new int[size];
printArray(arr, size);
mergeSort(arr, buffer, 0, size - 1);
printArray(arr, size);
delete[] buffer;
return 0;
}
printArray
method:-
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}
Which way of writing Merge Sort is better and faster ?