#include <iostream>
using namespace std;
void merge(int A[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int L[50], R[50];
for (int i = 0; i < n1; i++)
L[i] = A[p + i];
for (int j = 0; j < n2; j++)
R[j] = A[q + 1 + j];
int i = 0, j = 0, k = p;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
} else {
A[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
A[k] = L[i];
i++;
k++;
}
while (j < n2) {
A[k] = R[j];
j++;
k++;
}
}
void mergeSort(int A[], int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(A, p, q);
mergeSort(A, q + 1, r);
merge(A, p, q, r);
}
}
void printArray(int A[], int n) {
for (int i = 0; i < n; i++)
cout << A[i] << " ";
cout << endl;
}
int main() {
int A[] = {38, 27, 43, 3, 9, 82, 10};
int n = sizeof(A) / sizeof(A[0]);
cout << "Original Array: ";
printArray(A, n);
mergeSort(A, 0, n - 1);
cout << "Sorted Array (Merge Sort): ";
printArray(A, n);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBtZXJnZShpbnQgQVtdLCBpbnQgcCwgaW50IHEsIGludCByKSB7CiAgICBpbnQgbjEgPSBxIC0gcCArIDE7CiAgICBpbnQgbjIgPSByIC0gcTsKICAgIGludCBMWzUwXSwgUls1MF07CgoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjE7IGkrKykKICAgICAgICBMW2ldID0gQVtwICsgaV07CiAgICBmb3IgKGludCBqID0gMDsgaiA8IG4yOyBqKyspCiAgICAgICAgUltqXSA9IEFbcSArIDEgKyBqXTsKCiAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gcDsKCgogICAgd2hpbGUgKGkgPCBuMSAmJiBqIDwgbjIpIHsKICAgICAgICBpZiAoTFtpXSA8PSBSW2pdKSB7CiAgICAgICAgICAgIEFba10gPSBMW2ldOwogICAgICAgICAgICBpKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQVtrXSA9IFJbal07CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaysrOwogICAgfQoKCiAgICB3aGlsZSAoaSA8IG4xKSB7CiAgICAgICAgQVtrXSA9IExbaV07CiAgICAgICAgaSsrOwogICAgICAgIGsrKzsKICAgIH0KCgogICAgd2hpbGUgKGogPCBuMikgewogICAgICAgIEFba10gPSBSW2pdOwogICAgICAgIGorKzsKICAgICAgICBrKys7CiAgICB9Cn0KCnZvaWQgbWVyZ2VTb3J0KGludCBBW10sIGludCBwLCBpbnQgcikgewogICAgaWYgKHAgPCByKSB7CiAgICAgICAgaW50IHEgPSAocCArIHIpIC8gMjsKICAgICAgICBtZXJnZVNvcnQoQSwgcCwgcSk7CiAgICAgICAgbWVyZ2VTb3J0KEEsIHEgKyAxLCByKTsKICAgICAgICBtZXJnZShBLCBwLCBxLCByKTsKICAgIH0KfQoKdm9pZCBwcmludEFycmF5KGludCBBW10sIGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBjb3V0IDw8IEFbaV0gPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBBW10gPSB7MzgsIDI3LCA0MywgMywgOSwgODIsIDEwfTsKICAgIGludCBuID0gc2l6ZW9mKEEpIC8gc2l6ZW9mKEFbMF0pOwoKICAgIGNvdXQgPDwgIk9yaWdpbmFsIEFycmF5OiAiOwogICAgcHJpbnRBcnJheShBLCBuKTsKCiAgICBtZXJnZVNvcnQoQSwgMCwgbiAtIDEpOwoKICAgIGNvdXQgPDwgIlNvcnRlZCBBcnJheSAoTWVyZ2UgU29ydCk6ICI7CiAgICBwcmludEFycmF5KEEsIG4pOwoKICAgIHJldHVybiAwOwp9Cg==