#include <iostream>
#include <stdlib.h>
#include <omp.h>
#include <chrono>
#include <random>
using namespace std;
void bubble(int *, int);
void parallel_bubble(int *, int);
void swap(int &, int &);
void mergesort(int a[], int i, int j);
void parallel_mergesort(int a[], int i, int j);
void merge(int a[], int i1, int j1, int i2, int j2);
void generateRandomArray(int arr[], int size, int seed)
{
// Create a random number generator engine with the given seed
mt19937 rng(seed);
// Create a uniform distribution for random integers
uniform_int_distribution<int> dist(1, 1000);
// Generate random numbers and fill the array
for (int i = 0; i < size; ++i)
{
arr[i] = dist(rng);
}
}
void parallel_mergesort(int a[], int i, int j)
{
int mid;
if (i < j)
{
mid = (i + j) / 2;
#pragma omp parallel sections
{
#pragma omp section
{
mergesort(a, i, mid);
}
#pragma omp section
{
mergesort(a, mid + 1, j);
}
}
#pragma omp barrier
{
merge(a, i, mid, mid + 1, j);
}
}
}
void mergesort(int a[], int i, int j)
{
int mid;
if (i < j)
{
mid = (i + j) / 2;
mergesort(a, i, mid);
mergesort(a, mid + 1, j);
}
merge(a, i, mid, mid + 1, j);
}
void merge(int a[], int i1, int j1, int i2, int j2)
{
int temp[1000];
int i, j, k;
i = i1;
j = i2;
k = 0;
while (i <= j1 && j <= j2)
{
if (a[i] < a[j])
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++];
}
}
while (i <= j1)
{
temp[k++] = a[i++];
}
while (j <= j2)
{
temp[k++] = a[j++];
}
for (i = i1, j = 0; i <= j2; i++, j++)
{
a[i] = temp[j];
}
}
void parallel_bubble(int *a, int n)
{
for (int i = 0; i < n; i++)
{
int first = i % 2;
for (int j = first; j < n - 1; j += 2)
{
if (a[j] > a[j + 1])
{
swap(a[j], a[j + 1]);
}
}
}
}
void bubble(int *a, int n)
{
for (int i = 0; i < n; i++)
{
int first = i % 2;
#pragma omp parallel for shared(a, first)
for (int j = first; j < n - 1; j += 2)
{
if (a[j] > a[j + 1])
{
swap(a[j], a[j + 1]);
}
}
}
}
void swap(int &a, int &b)
{
int test;
test = a;
a = b;
b = test;
}
int main()
{
int n, a[n],b[n],c[n],d[n], seed = 20;
cout << "\n enter total no of elements=>";
cin >> n;
generateRandomArray(a, n, seed);
auto start = chrono::high_resolution_clock::now();
bubble(a, n);
auto end = std::chrono::high_resolution_clock::now();
cout << endl;
// Calculate the duration
chrono::duration<double> duration = end - start;
cout << "\n sorted array is=> ";
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
// Print the duration
cout << "Time taken by Sequential Bubble sort: " << duration.count() << " seconds" << endl;
generateRandomArray(b, n, seed);
start = chrono::high_resolution_clock::now();
parallel_bubble(b, n);
end = std::chrono::high_resolution_clock::now();
cout << endl;
// Calculate the duration
duration = end - start;
cout << "\n sorted array is=> ";
for (int i = 0; i < n; i++)
{
cout << b[i] << " ";
}
// Print the duration
cout << "Time taken by Parallel Bubble sort: " << duration.count() << " seconds" << endl;
generateRandomArray(d, n, seed);
start = chrono::high_resolution_clock::now();
parallel_mergesort(d, 0, n-1);
end = std::chrono::high_resolution_clock::now();
cout << endl;
// Calculate the duration
duration = end - start;
cout << "\n sorted array is=> ";
for (int i = 0; i < n; i++)
{
cout << d[i] << " ";
}
// Print the duration
cout << "Time taken by Parallel Merge sort: " << duration.count() << " seconds" << endl;
cout<<"Merge Sort--->>>>>>>>>";
generateRandomArray(c, n, seed);
cout<<"Merge array Sort--->>>>>>>>>";
start = chrono::high_resolution_clock::now();
mergesort(c, 0, n-1);
end = std::chrono::high_resolution_clock::now();
cout << endl;
cout<<"Merge end-->>>>>";
// Calculate the duration
duration = end - start;
cout << "\n sorted array is=> ";
for (int i = 0; i < n; i++)
{
cout << c[i] << " ";
}
// Print the duration
cout << "Time taken by Sequential Merge sort: " << duration.count() << " seconds" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxvbXAuaD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHJhbmRvbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdm9pZCBidWJibGUoaW50ICosIGludCk7CnZvaWQgcGFyYWxsZWxfYnViYmxlKGludCAqLCBpbnQpOwp2b2lkIHN3YXAoaW50ICYsIGludCAmKTsKdm9pZCBtZXJnZXNvcnQoaW50IGFbXSwgaW50IGksIGludCBqKTsKdm9pZCBwYXJhbGxlbF9tZXJnZXNvcnQoaW50IGFbXSwgaW50IGksIGludCBqKTsKdm9pZCBtZXJnZShpbnQgYVtdLCBpbnQgaTEsIGludCBqMSwgaW50IGkyLCBpbnQgajIpOwoKdm9pZCBnZW5lcmF0ZVJhbmRvbUFycmF5KGludCBhcnJbXSwgaW50IHNpemUsIGludCBzZWVkKQp7CiAgICAvLyBDcmVhdGUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgd2l0aCB0aGUgZ2l2ZW4gc2VlZAoKICAgIG10MTk5Mzcgcm5nKHNlZWQpOwogICAgLy8gQ3JlYXRlIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBpbnRlZ2VycwogICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gZGlzdCgxLCAxMDAwKTsKICAgIC8vIEdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIGFuZCBmaWxsIHRoZSBhcnJheQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCiAgICB7CiAgICAgICAgYXJyW2ldID0gZGlzdChybmcpOwogICAgfQp9Cgp2b2lkIHBhcmFsbGVsX21lcmdlc29ydChpbnQgYVtdLCBpbnQgaSwgaW50IGopCnsKICAgIGludCBtaWQ7CiAgICBpZiAoaSA8IGopCiAgICB7CiAgICAgICAgbWlkID0gKGkgKyBqKSAvIDI7CgojcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucwogICAgICAgIHsKCiNwcmFnbWEgb21wIHNlY3Rpb24KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVyZ2Vzb3J0KGEsIGksIG1pZCk7CiAgICAgICAgICAgIH0KCiNwcmFnbWEgb21wIHNlY3Rpb24KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVyZ2Vzb3J0KGEsIG1pZCArIDEsIGopOwogICAgICAgICAgICB9CiAgICAgICAgfQojcHJhZ21hIG9tcCBiYXJyaWVyCnsKICAgICAgICBtZXJnZShhLCBpLCBtaWQsIG1pZCArIDEsIGopOwp9CiAgICB9Cn0KCnZvaWQgbWVyZ2Vzb3J0KGludCBhW10sIGludCBpLCBpbnQgaikKewogICAgaW50IG1pZDsKICAgIGlmIChpIDwgaikKICAgIHsKICAgICAgICBtaWQgPSAoaSArIGopIC8gMjsKCiAgICAgICAgbWVyZ2Vzb3J0KGEsIGksIG1pZCk7CgogICAgICAgIG1lcmdlc29ydChhLCBtaWQgKyAxLCBqKTsKICAgIH0KCiAgICBtZXJnZShhLCBpLCBtaWQsIG1pZCArIDEsIGopOwp9Cgp2b2lkIG1lcmdlKGludCBhW10sIGludCBpMSwgaW50IGoxLCBpbnQgaTIsIGludCBqMikKewogICAgaW50IHRlbXBbMTAwMF07CiAgICBpbnQgaSwgaiwgazsKICAgIGkgPSBpMTsKICAgIGogPSBpMjsKICAgIGsgPSAwOwoKICAgIHdoaWxlIChpIDw9IGoxICYmIGogPD0gajIpCiAgICB7CiAgICAgICAgaWYgKGFbaV0gPCBhW2pdKQogICAgICAgIHsKICAgICAgICAgICAgdGVtcFtrKytdID0gYVtpKytdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0ZW1wW2srK10gPSBhW2orK107CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlIChpIDw9IGoxKQogICAgewogICAgICAgIHRlbXBbaysrXSA9IGFbaSsrXTsKICAgIH0KCiAgICB3aGlsZSAoaiA8PSBqMikKICAgIHsKICAgICAgICB0ZW1wW2srK10gPSBhW2orK107CiAgICB9CgogICAgZm9yIChpID0gaTEsIGogPSAwOyBpIDw9IGoyOyBpKyssIGorKykKICAgIHsKICAgICAgICBhW2ldID0gdGVtcFtqXTsKICAgIH0KfQoKdm9pZCBwYXJhbGxlbF9idWJibGUoaW50ICphLCBpbnQgbikKewoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIGludCBmaXJzdCA9IGkgJSAyOwogICAgICAgIGZvciAoaW50IGogPSBmaXJzdDsgaiA8IG4gLSAxOyBqICs9IDIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoYVtqXSA+IGFbaiArIDFdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2FwKGFbal0sIGFbaiArIDFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp2b2lkIGJ1YmJsZShpbnQgKmEsIGludCBuKQp7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgaW50IGZpcnN0ID0gaSAlIDI7CiNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzaGFyZWQoYSwgZmlyc3QpCiAgICAgICAgZm9yIChpbnQgaiA9IGZpcnN0OyBqIDwgbiAtIDE7IGogKz0gMikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChhW2pdID4gYVtqICsgMV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3YXAoYVtqXSwgYVtqICsgMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHN3YXAoaW50ICZhLCBpbnQgJmIpCnsKICAgIGludCB0ZXN0OwogICAgdGVzdCA9IGE7CiAgICBhID0gYjsKICAgIGIgPSB0ZXN0Owp9CgppbnQgbWFpbigpCnsKCgogICAgaW50IG4sICBhW25dLGJbbl0sY1tuXSxkW25dLCBzZWVkID0gMjA7CiAgICBjb3V0IDw8ICJcbiBlbnRlciB0b3RhbCBubyBvZiBlbGVtZW50cz0+IjsKICAgIGNpbiA+PiBuOwoKICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoYSwgbiwgc2VlZCk7CiAgICBhdXRvIHN0YXJ0ID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgYnViYmxlKGEsIG4pOwogICAgYXV0byBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGNvdXQgPDwgZW5kbDsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uCiAgICBjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZHVyYXRpb24gPSBlbmQgLSBzdGFydDsKICAgIGNvdXQgPDwgIlxuIHNvcnRlZCBhcnJheSBpcz0+ICAiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgY291dCA8PCBhW2ldIDw8ICIgICI7CiAgICB9CiAgICAvLyBQcmludCB0aGUgZHVyYXRpb24KICAgIGNvdXQgPDwgIlRpbWUgdGFrZW4gYnkgU2VxdWVudGlhbCBCdWJibGUgc29ydDogICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIHNlY29uZHMiIDw8IGVuZGw7CgoKCiAgICBnZW5lcmF0ZVJhbmRvbUFycmF5KGIsIG4sIHNlZWQpOwogICAgc3RhcnQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBwYXJhbGxlbF9idWJibGUoYiwgbik7CiAgICBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGNvdXQgPDwgZW5kbDsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uCiAgICBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OwogICAgY291dCA8PCAiXG4gc29ydGVkIGFycmF5IGlzPT4gICI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjb3V0IDw8IGJbaV0gPDwgIiAgIjsKICAgIH0KICAgIC8vIFByaW50IHRoZSBkdXJhdGlvbgogICAgY291dCA8PCAiVGltZSB0YWtlbiBieSBQYXJhbGxlbCBCdWJibGUgc29ydDogICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIHNlY29uZHMiIDw8IGVuZGw7CgoKICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoZCwgbiwgc2VlZCk7CiAgICBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHBhcmFsbGVsX21lcmdlc29ydChkLCAwLCBuLTEpOwogICAgZW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBjb3V0IDw8IGVuZGw7CgogICAgLy8gQ2FsY3VsYXRlIHRoZSBkdXJhdGlvbgogICAgZHVyYXRpb24gPSBlbmQgLSBzdGFydDsKICAgIGNvdXQgPDwgIlxuIHNvcnRlZCBhcnJheSBpcz0+ICAiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgY291dCA8PCBkW2ldIDw8ICIgICI7CiAgICB9CiAgICAvLyBQcmludCB0aGUgZHVyYXRpb24KICAgIGNvdXQgPDwgIlRpbWUgdGFrZW4gYnkgUGFyYWxsZWwgTWVyZ2Ugc29ydDogICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIHNlY29uZHMiIDw8IGVuZGw7CgogIApjb3V0PDwiTWVyZ2UgU29ydC0tLT4+Pj4+Pj4+PiI7CiAgICBnZW5lcmF0ZVJhbmRvbUFycmF5KGMsIG4sIHNlZWQpOwpjb3V0PDwiTWVyZ2UgYXJyYXkgU29ydC0tLT4+Pj4+Pj4+PiI7CiAgICAKICAgIHN0YXJ0ID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgbWVyZ2Vzb3J0KGMsIDAsIG4tMSk7CiAgICBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGNvdXQgPDwgZW5kbDsKY291dDw8Ik1lcmdlIGVuZC0tPj4+Pj4iOwogICAgLy8gQ2FsY3VsYXRlIHRoZSBkdXJhdGlvbgogICAgZHVyYXRpb24gPSBlbmQgLSBzdGFydDsKICAgIGNvdXQgPDwgIlxuIHNvcnRlZCBhcnJheSBpcz0+ICAiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgY291dCA8PCBjW2ldIDw8ICIgICI7CiAgICB9CiAgICAvLyBQcmludCB0aGUgZHVyYXRpb24KICAgIGNvdXQgPDwgIlRpbWUgdGFrZW4gYnkgU2VxdWVudGlhbCBNZXJnZSBzb3J0OiAgIiA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCgoKICAgIHJldHVybiAwOwp9Cg==