#include<iostream>
using namespace std;
void Merge(int A[], int l, int m, int r);
void MergeSort(int A[], int l, int r);
void swap(int& x, int& y);
void print(int A[], int n);
int main()
{
int A[] = { 30, 10, 12, 5, 90, 7, 120 };
int n = sizeof(A) / sizeof(A[0]);
cout << "Before Sorting: ";
print(A, n);
MergeSort(A, 0, n -1);
cout << "After Sorting: ";
print(A, n);
}
void Merge(int A[], int l, int m, int r)
{
inti, j, k, nl, nr;
// size of left and right sub -arrays
nl = m - l + 1;
nr = r - m;
int lA[nl], rA[nr];
// fill left and right sub -arrays
for(i = 0; i < nl; i++)
lA[i] = A[l+ i];
for(j = 0; j < nr; j++)
rA[j] = A[m + 1 + j];
i = 0; j = 0; k = l;
// nl = 4, nr = 4
// 0 1 2 3
// lA = [ 2 3 5 8 ]
// rA = [ 1 4 7 9 ]
// A = [ ]
// i = 0, j = 0, k = 0
// merge temp arrays to real array
while(i < nl && j < nr)
{
if(lA[i] <= rA[j])
{
A[k] = lA[i];
i++;
}
else
{
A[k] = rA[j];
j++;
}
k++;
}
// extra element in left array
while (i < nl)
{
A[k] = lA[i];
i++; k++;
}
// extra element in right array
while (j < nr)
{
A[k] = rA[j];
j++; k++;
}
}
void MergeSort(int A[], int left, int right)
{
// 0 1 2 3 4 5 6 7
// A = [ 2 8 5 3 9 4 1 7 ]
// left = 0, right = 7, middle = 3
if (left < right)
{
int middle = left + (right - left) / 2;
// middle = 0 + (7 - 0) / 2 = 3.5 = 3
MergeSort(A, left, middle);
MergeSort(A, middle + 1, right);
Merge(A, left, middle, right);
}
}
void swap(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
void print(int A[], int n)
{
for(inti = 0; i < n; i++)
cout << A[i] << " ";
cout << endl;
}
Merge Sort
C++
implementation
(Trace Version)