#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
void merge(vector<int>& arr, int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
vector<int> L(n1), R(n2);
for (i = 0; i < n1; i++) {
L[i] = arr[l + i];
}
for (j = 0; j < n2; j++) {
R[j] = arr[m + 1 + j];
}
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k++] = L[i++];
} else {
arr[k++] = R[j++];
}
}
}
void merge_sort(vector<int>& arr, int l, int r) {
if (l < r) {
int m = l + (r - l) / 2;
#pragma omp task
merge_sort(arr, l, m);
#pragma omp task
merge_sort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
void parallel_merge_sort(vector<int>& arr) {
#pragma omp parallel
{
#pragma omp single
merge_sort(arr, 0, arr.size() - 1);
}
}
int main() {
vector<int> arr = {5, 2, 9, 1, 7, 6, 8, 3, 4};
double start, end;
// Measure performance of sequential merge sort
start = omp_get_wtime();
merge_sort(arr, 0, arr.size() - 1);
end = omp_get_wtime();
cout << "Sequential merge sort time: " << end - start << " seconds" << endl;
// Measure performance of parallel merge sort
arr = {5, 2, 9, 1, 7, 6, 8, 3, 4};
start = omp_get_wtime();
parallel_merge_sort(arr);
end = omp_get_wtime();
cout << "Parallel merge sort time: " << end - start << " seconds" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8b21wLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBtZXJnZSh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbCwgaW50IG0sIGludCByKSB7CiAgICBpbnQgaSwgaiwgazsKICAgIGludCBuMSA9IG0gLSBsICsgMTsKICAgIGludCBuMiA9IHIgLSBtOwogICAgdmVjdG9yPGludD4gTChuMSksIFIobjIpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuMTsgaSsrKSB7CiAgICAgICAgTFtpXSA9IGFycltsICsgaV07CiAgICB9CiAgICBmb3IgKGogPSAwOyBqIDwgbjI7IGorKykgewogICAgICAgIFJbal0gPSBhcnJbbSArIDEgKyBqXTsKICAgIH0KCiAgICBpID0gMDsKICAgIGogPSAwOwogICAgayA9IGw7CiAgICB3aGlsZSAoaSA8IG4xICYmIGogPCBuMikgewogICAgICAgIGlmIChMW2ldIDw9IFJbal0pIHsKICAgICAgICAgICAgYXJyW2srK10gPSBMW2krK107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXJyW2srK10gPSBSW2orK107CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIG1lcmdlX3NvcnQodmVjdG9yPGludD4mIGFyciwgaW50IGwsIGludCByKSB7CiAgICBpZiAobCA8IHIpIHsKICAgICAgICBpbnQgbSA9IGwgKyAociAtIGwpIC8gMjsKICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCiAgICAgICAgbWVyZ2Vfc29ydChhcnIsIGwsIG0pOwogICAgICAgICNwcmFnbWEgb21wIHRhc2sKICAgICAgICBtZXJnZV9zb3J0KGFyciwgbSArIDEsIHIpOwogICAgICAgIG1lcmdlKGFyciwgbCwgbSwgcik7CiAgICB9Cn0KCnZvaWQgcGFyYWxsZWxfbWVyZ2Vfc29ydCh2ZWN0b3I8aW50PiYgYXJyKSB7CiAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAogICAgewogICAgICAgICNwcmFnbWEgb21wIHNpbmdsZQogICAgICAgIG1lcmdlX3NvcnQoYXJyLCAwLCBhcnIuc2l6ZSgpIC0gMSk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYXJyID0gezUsIDIsIDksIDEsIDcsIDYsIDgsIDMsIDR9OwogICAgZG91YmxlIHN0YXJ0LCBlbmQ7CgogICAgLy8gTWVhc3VyZSBwZXJmb3JtYW5jZSBvZiBzZXF1ZW50aWFsIG1lcmdlIHNvcnQKICAgIHN0YXJ0ID0gb21wX2dldF93dGltZSgpOwogICAgbWVyZ2Vfc29ydChhcnIsIDAsIGFyci5zaXplKCkgLSAxKTsKICAgIGVuZCA9IG9tcF9nZXRfd3RpbWUoKTsKICAgIGNvdXQgPDwgIlNlcXVlbnRpYWwgbWVyZ2Ugc29ydCB0aW1lOiAiIDw8IGVuZCAtIHN0YXJ0IDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCiAgICAvLyBNZWFzdXJlIHBlcmZvcm1hbmNlIG9mIHBhcmFsbGVsIG1lcmdlIHNvcnQKICAgIGFyciA9IHs1LCAyLCA5LCAxLCA3LCA2LCA4LCAzLCA0fTsKICAgIHN0YXJ0ID0gb21wX2dldF93dGltZSgpOwogICAgcGFyYWxsZWxfbWVyZ2Vfc29ydChhcnIpOwogICAgZW5kID0gb21wX2dldF93dGltZSgpOwogICAgY291dCA8PCAiUGFyYWxsZWwgbWVyZ2Ugc29ydCB0aW1lOiAiIDw8IGVuZCAtIHN0YXJ0IDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=