#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 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 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 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 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 parallel_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+CiNpbmNsdWRlIDxvbXAuaD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHJhbmRvbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgYnViYmxlKGludCAqLCBpbnQpOwp2b2lkIHBhcmFsbGVsX2J1YmJsZShpbnQgKiwgaW50KTsKdm9pZCBzd2FwKGludCAmLCBpbnQgJik7CnZvaWQgbWVyZ2Vzb3J0KGludCBhW10sIGludCBpLCBpbnQgaik7CnZvaWQgcGFyYWxsZWxfbWVyZ2Vzb3J0KGludCBhW10sIGludCBpLCBpbnQgaik7CnZvaWQgbWVyZ2UoaW50IGFbXSwgaW50IGkxLCBpbnQgajEsIGludCBpMiwgaW50IGoyKTsKCnZvaWQgZ2VuZXJhdGVSYW5kb21BcnJheShpbnQgYXJyW10sIGludCBzaXplLCBpbnQgc2VlZCkKewogICAgLy8gQ3JlYXRlIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIHdpdGggdGhlIGdpdmVuIHNlZWQKCiAgICBtdDE5OTM3IHJuZyhzZWVkKTsKICAgIC8vIENyZWF0ZSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGZvciByYW5kb20gaW50ZWdlcnMKICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QoMSwgMTAwMCk7CiAgICAvLyBHZW5lcmF0ZSByYW5kb20gbnVtYmVycyBhbmQgZmlsbCB0aGUgYXJyYXkKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQogICAgewogICAgICAgIGFycltpXSA9IGRpc3Qocm5nKTsKICAgIH0KfQoKdm9pZCBtZXJnZXNvcnQoaW50IGFbXSxpbnQgaSxpbnQgaikKewoJaW50IG1pZDsKCWlmKGk8aikKCXsKICAgIAltaWQ9KGkraikvMjsKICAgCSAKICAgIAkKICAgIAl7CgogICAgICAgIAkKICAgICAgICAJewogICAgICAgICAgICAJbWVyZ2Vzb3J0KGEsaSxtaWQpOyAgIAkgCiAgICAgICAgCX0KCiAgICAgICAgCQogICAgICAgIAl7CiAgICAgICAgICAgIAltZXJnZXNvcnQoYSxtaWQrMSxqKTsgICAgCiAgICAgICAgCX0KICAgIAl9CiAgICAgICAgIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJbWVyZ2UoYSxpLG1pZCxtaWQrMSxqKTsgICAgCiAgICAgICAgICAgIH0KCn0KfQp2b2lkIHBhcmFsbGVsX21lcmdlc29ydChpbnQgYVtdLGludCBpLGludCBqKQp7CglpbnQgbWlkOwoJaWYoaTxqKQoJewogICAgCW1pZD0oaStqKS8yOwogICAJIAogICAgCSNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zCiAgICAJewoKICAgICAgICAJI3ByYWdtYSBvbXAgc2VjdGlvbgogICAgICAgIAl7CiAgICAgICAgICAgIAltZXJnZXNvcnQoYSxpLG1pZCk7ICAgCSAKICAgICAgICAJfQoKICAgICAgICAJI3ByYWdtYSBvbXAgc2VjdGlvbgogICAgICAgIAl7CiAgICAgICAgICAgIAltZXJnZXNvcnQoYSxtaWQrMSxqKTsgICAgCiAgICAgICAgCX0KICAgIAl9CiAgICAgICAgICAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAltZXJnZShhLGksbWlkLG1pZCsxLGopOyAgICAKICAgICAgICAgICAgfQoKfQp9CiAKdm9pZCBtZXJnZShpbnQgYVtdLGludCBpMSxpbnQgajEsaW50IGkyLGludCBqMikKewoJaW50IHRlbXBbMTAwMF07ICAgIAoJaW50IGksaixrOwoJaT1pMTsgICAgCglqPWkyOyAgICAKCWs9MDsKICAgIAoJd2hpbGUoaTw9ajEgJiYgajw9ajIpICAgIAoJewogICAgCWlmKGFbaV08YVtqXSkKICAgIAl7CiAgICAgICAgCXRlbXBbaysrXT1hW2krK107CiAgICAJfQogICAgCWVsc2UKICAgIAl7CiAgICAgICAgCXRlbXBbaysrXT1hW2orK107CiAgICAgICAgfSAgICAKCX0KICAgIAoJd2hpbGUoaTw9ajEpICAgIAoJewogICAgCXRlbXBbaysrXT1hW2krK107Cgl9CiAgIAkgCgl3aGlsZShqPD1qMikgICAgCgl7CiAgICAJdGVtcFtrKytdPWFbaisrXTsKCX0KICAgCSAKCWZvcihpPWkxLGo9MDtpPD1qMjtpKyssaisrKQoJewogICAgCWFbaV09dGVtcFtqXTsKCX0gICAgCn0KCgp2b2lkIGJ1YmJsZShpbnQgKmEsIGludCBuKQp7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgaW50IGZpcnN0ID0gaSAlIDI7CiAgICAgICAgZm9yIChpbnQgaiA9IGZpcnN0OyBqIDwgbiAtIDE7IGogKz0gMikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChhW2pdID4gYVtqICsgMV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3YXAoYVtqXSwgYVtqICsgMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CnZvaWQgcGFyYWxsZWxfYnViYmxlKGludCAqYSwgaW50IG4pCnsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBpbnQgZmlyc3QgPSBpICUgMjsKI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNoYXJlZChhLCBmaXJzdCkKICAgICAgICBmb3IgKGludCBqID0gZmlyc3Q7IGogPCBuIC0gMTsgaiArPSAyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFbal0gPiBhW2ogKyAxXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3dhcChhW2pdLCBhW2ogKyAxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgc3dhcChpbnQgJmEsIGludCAmYikKewogICAgaW50IHRlc3Q7CiAgICB0ZXN0ID0gYTsKICAgIGEgPSBiOwogICAgYiA9IHRlc3Q7Cn0KCmludCBtYWluKCkKewoKCiAgICBpbnQgbiwgIGFbbl0sYltuXSxjW25dLGRbbl0sIHNlZWQgPSAyMDsKICAgIGNvdXQgPDwgIlxuIGVudGVyIHRvdGFsIG5vIG9mIGVsZW1lbnRzPT4iOwogICAgY2luID4+IG47CgogICAgZ2VuZXJhdGVSYW5kb21BcnJheShhLCBuLCBzZWVkKTsKICAgIGF1dG8gc3RhcnQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBidWJibGUoYSwgbik7CiAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgY291dCA8PCBlbmRsOwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgZHVyYXRpb24KICAgIGNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OwogICAgY291dCA8PCAiXG4gc29ydGVkIGFycmF5IGlzPT4gICI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjb3V0IDw8IGFbaV0gPDwgIiAgIjsKICAgIH0KICAgIC8vIFByaW50IHRoZSBkdXJhdGlvbgogICAgY291dCA8PCAiVGltZSB0YWtlbiBieSBTZXF1ZW50aWFsIEJ1YmJsZSBzb3J0OiAgIiA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCgoKICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoYiwgbiwgc2VlZCk7CiAgICBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHBhcmFsbGVsX2J1YmJsZShiLCBuKTsKICAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgY291dCA8PCBlbmRsOwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgZHVyYXRpb24KICAgIGR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7CiAgICBjb3V0IDw8ICJcbiBzb3J0ZWQgYXJyYXkgaXM9PiAgIjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIGNvdXQgPDwgYltpXSA8PCAiICAiOwogICAgfQogICAgLy8gUHJpbnQgdGhlIGR1cmF0aW9uCiAgICBjb3V0IDw8ICJUaW1lIHRha2VuIGJ5IFBhcmFsbGVsIEJ1YmJsZSBzb3J0OiAgIiA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCgogICAgZ2VuZXJhdGVSYW5kb21BcnJheShkLCBuLCBzZWVkKTsKICAgIHN0YXJ0ID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgcGFyYWxsZWxfbWVyZ2Vzb3J0KGQsIDAsIG4tMSk7CiAgICBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGNvdXQgPDwgZW5kbDsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uCiAgICBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OwogICAgY291dCA8PCAiXG4gc29ydGVkIGFycmF5IGlzPT4gICI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjb3V0IDw8IGRbaV0gPDwgIiAgIjsKICAgIH0KICAgIC8vIFByaW50IHRoZSBkdXJhdGlvbgogICAgY291dCA8PCAiVGltZSB0YWtlbiBieSBQYXJhbGxlbCBNZXJnZSBzb3J0OiAgIiA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgc2Vjb25kcyIgPDwgZW5kbDsKCiAgCmNvdXQ8PCJNZXJnZSBTb3J0LS0tPj4+Pj4+Pj4+IjsKICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoYywgbiwgc2VlZCk7CmNvdXQ8PCJNZXJnZSBhcnJheSBTb3J0LS0tPj4+Pj4+Pj4+IjsKICAgIAogICAgc3RhcnQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBtZXJnZXNvcnQoYywgMCwgbi0xKTsKICAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgY291dCA8PCBlbmRsOwpjb3V0PDwiTWVyZ2UgZW5kLS0+Pj4+PiI7CiAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uCiAgICBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OwogICAgY291dCA8PCAiXG4gc29ydGVkIGFycmF5IGlzPT4gICI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjb3V0IDw8IGNbaV0gPDwgIiAgIjsKICAgIH0KICAgIC8vIFByaW50IHRoZSBkdXJhdGlvbgogICAgY291dCA8PCAiVGltZSB0YWtlbiBieSBTZXF1ZW50aWFsIE1lcmdlIHNvcnQ6ICAiIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwgIiBzZWNvbmRzIiA8PCBlbmRsOwoKCgogICAgcmV0dXJuIDA7Cn0K