#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
// Sequential Bubble Sort
void bubbleSortSeq(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1])
swap(arr[j], arr[j+1]);
}
// Parallel Bubble Sort
void bubbleSortPar(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n; i++) {
#pragma omp parallel for
for (int j = i % 2; j < n - 1; j += 2)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
}
// Merge function
void merge(vector<int>& arr, int l, int m, int r) {
vector<int> left(arr.begin() + l, arr.begin() + m + 1);
vector<int> right(arr.begin() + m + 1, arr.begin() + r + 1);
int i = 0, j = 0, k = l;
while (i < left.size() && j < right.size())
arr[k++] = (left[i] < right[j]) ? left[i++] : right[j++];
while (i < left.size()) arr[k++] = left[i++];
while (j < right.size()) arr[k++] = right[j++];
}
// Sequential Merge Sort
void mergeSortSeq(vector<int>& arr, int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergeSortSeq(arr, l, m);
mergeSortSeq(arr, m + 1, r);
merge(arr, l, m, r);
}
}
// Parallel Merge Sort
void mergeSortPar(vector<int>& arr, int l, int r) {
if (l < r) {
int m = (l + r) / 2;
#pragma omp parallel sections
{
#pragma omp section
mergeSortPar(arr, l, m);
#pragma omp section
mergeSortPar(arr, m + 1, r);
}
merge(arr, l, m, r);
}
}
int main() {
vector<int> data = {8, 5, 2, 9, 1, 4};
vector<int> arr1 = data, arr2 = data;
vector<int> arr3 = data, arr4 = data;
bubbleSortSeq(arr1);
bubbleSortPar(arr2);
mergeSortSeq(arr3, 0, arr3.size() - 1);
mergeSortPar(arr4, 0, arr4.size() - 1);
cout << "Sorted (Seq Bubble): ";
for (int x : arr1) cout << x << " ";
cout << "\nSorted (Par Bubble): ";
for (int x : arr2) cout << x << " ";
cout << "\nSorted (Seq Merge): ";
for (int x : arr3) cout << x << " ";
cout << "\nSorted (Par Merge): ";
for (int x : arr4) cout << x << " ";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8b21wLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBTZXF1ZW50aWFsIEJ1YmJsZSBTb3J0CnZvaWQgYnViYmxlU29ydFNlcSh2ZWN0b3I8aW50PiYgYXJyKSB7CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4tMTsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbi1pLTE7IGorKykKICAgICAgICAgICAgaWYgKGFycltqXSA+IGFycltqKzFdKQogICAgICAgICAgICAgICAgc3dhcChhcnJbal0sIGFycltqKzFdKTsKfQoKLy8gUGFyYWxsZWwgQnViYmxlIFNvcnQKdm9pZCBidWJibGVTb3J0UGFyKHZlY3RvcjxpbnQ+JiBhcnIpIHsKICAgIGludCBuID0gYXJyLnNpemUoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yCiAgICAgICAgZm9yIChpbnQgaiA9IGkgJSAyOyBqIDwgbiAtIDE7IGogKz0gMikKICAgICAgICAgICAgaWYgKGFycltqXSA+IGFycltqICsgMV0pCiAgICAgICAgICAgICAgICBzd2FwKGFycltqXSwgYXJyW2ogKyAxXSk7CiAgICB9Cn0KCi8vIE1lcmdlIGZ1bmN0aW9uCnZvaWQgbWVyZ2UodmVjdG9yPGludD4mIGFyciwgaW50IGwsIGludCBtLCBpbnQgcikgewogICAgdmVjdG9yPGludD4gbGVmdChhcnIuYmVnaW4oKSArIGwsIGFyci5iZWdpbigpICsgbSArIDEpOwogICAgdmVjdG9yPGludD4gcmlnaHQoYXJyLmJlZ2luKCkgKyBtICsgMSwgYXJyLmJlZ2luKCkgKyByICsgMSk7CiAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gbDsKICAgIHdoaWxlIChpIDwgbGVmdC5zaXplKCkgJiYgaiA8IHJpZ2h0LnNpemUoKSkKICAgICAgICBhcnJbaysrXSA9IChsZWZ0W2ldIDwgcmlnaHRbal0pID8gbGVmdFtpKytdIDogcmlnaHRbaisrXTsKICAgIHdoaWxlIChpIDwgbGVmdC5zaXplKCkpIGFycltrKytdID0gbGVmdFtpKytdOwogICAgd2hpbGUgKGogPCByaWdodC5zaXplKCkpIGFycltrKytdID0gcmlnaHRbaisrXTsKfQoKLy8gU2VxdWVudGlhbCBNZXJnZSBTb3J0CnZvaWQgbWVyZ2VTb3J0U2VxKHZlY3RvcjxpbnQ+JiBhcnIsIGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPCByKSB7CiAgICAgICAgaW50IG0gPSAobCArIHIpIC8gMjsKICAgICAgICBtZXJnZVNvcnRTZXEoYXJyLCBsLCBtKTsKICAgICAgICBtZXJnZVNvcnRTZXEoYXJyLCBtICsgMSwgcik7CiAgICAgICAgbWVyZ2UoYXJyLCBsLCBtLCByKTsKICAgIH0KfQoKLy8gUGFyYWxsZWwgTWVyZ2UgU29ydAp2b2lkIG1lcmdlU29ydFBhcih2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsIDwgcikgewogICAgICAgIGludCBtID0gKGwgKyByKSAvIDI7CiAgICAgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMKICAgICAgICB7CiAgICAgICAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KICAgICAgICAgICAgbWVyZ2VTb3J0UGFyKGFyciwgbCwgbSk7CiAgICAgICAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KICAgICAgICAgICAgbWVyZ2VTb3J0UGFyKGFyciwgbSArIDEsIHIpOwogICAgICAgIH0KICAgICAgICBtZXJnZShhcnIsIGwsIG0sIHIpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxpbnQ+IGRhdGEgPSB7OCwgNSwgMiwgOSwgMSwgNH07CiAgICB2ZWN0b3I8aW50PiBhcnIxID0gZGF0YSwgYXJyMiA9IGRhdGE7CiAgICB2ZWN0b3I8aW50PiBhcnIzID0gZGF0YSwgYXJyNCA9IGRhdGE7CgogICAgYnViYmxlU29ydFNlcShhcnIxKTsKICAgIGJ1YmJsZVNvcnRQYXIoYXJyMik7CiAgICBtZXJnZVNvcnRTZXEoYXJyMywgMCwgYXJyMy5zaXplKCkgLSAxKTsKICAgIG1lcmdlU29ydFBhcihhcnI0LCAwLCBhcnI0LnNpemUoKSAtIDEpOwoKICAgIGNvdXQgPDwgIlNvcnRlZCAoU2VxIEJ1YmJsZSk6ICI7CiAgICBmb3IgKGludCB4IDogYXJyMSkgY291dCA8PCB4IDw8ICIgIjsKICAgIGNvdXQgPDwgIlxuU29ydGVkIChQYXIgQnViYmxlKTogIjsKICAgIGZvciAoaW50IHggOiBhcnIyKSBjb3V0IDw8IHggPDwgIiAiOwogICAgY291dCA8PCAiXG5Tb3J0ZWQgKFNlcSBNZXJnZSk6ICAiOwogICAgZm9yIChpbnQgeCA6IGFycjMpIGNvdXQgPDwgeCA8PCAiICI7CiAgICBjb3V0IDw8ICJcblNvcnRlZCAoUGFyIE1lcmdlKTogICI7CiAgICBmb3IgKGludCB4IDogYXJyNCkgY291dCA8PCB4IDw8ICIgIjsKfQo=