You are on page 1of 3

#include<iostream>

#include<pthread.h>
using namespace std;
/*struct argument{
int *arr;
int siz;
};
*/
int *array;
void *compare_plus(void *a){
pair<int,int> *p= (pair<int,int>* )a;
if(array[p->first]>array[p->second]){
int temp=array[p->first];
array[p->first]=array[p->second];
array[p->second]=temp;
}
pthread_exit(NULL);

}
void *compare_minus(void *a){
pair<int,int> *p= (pair<int,int>* )a;
if(array[p->first]<array[p->second]){
int temp=array[p->first];
array[p->first]=array[p->second];
array[p->second]=temp;
}
pthread_exit(NULL);

}
void *make_bitonic_plus(void* a);
void *make_bitonic_minus(void* a)
{
pair<int,int> *arg= (pair<int,int> *) a;
int ptr= arg->first;
int n=arg->second;
if(n>1){
pthread_t *tt=new pthread_t[2];
pair<int,int> *temp1= new pair<int,int> (ptr,n/2);
pair<int,int> *temp2= new pair<int,int>(ptr+n/2,n/2);
pthread_create(&tt[0],NULL,make_bitonic_plus,(void *)temp1);
pthread_create(&tt[1],NULL,make_bitonic_minus,(void *)temp2);
pthread_join(tt[0],NULL);
pthread_join(tt[1],NULL);

}
int start=ptr,endd=ptr+n;
int x=n/2;
pthread_t *threads=new pthread_t[n/2];
while(x>0){
int k=0;
for(int i=start;i<endd;i+=2*x){
for(int j=i;j<i+x;j++)
{pair<int,int> *p=new pair<int,int>(j,j+x);
pthread_create(&threads[k++],NULL,compare_minus, (void *) p);
}

}
for(int i=0;i<n/2;i++){
pthread_join(threads[i],NULL);
}
x/=2;

}
pthread_exit(NULL);

}
void *make_bitonic_plus(void* a){
pair<int,int> *arg= (pair<int,int> *) a;
int ptr= arg->first;
int n=arg->second;
if(n>1){
pthread_t *tt=new pthread_t[2];
pair<int,int> *temp1= new pair<int,int> (ptr,n/2);
pair<int,int> *temp2= new pair<int,int>(ptr+n/2,n/2);
pthread_create(&tt[0],NULL,make_bitonic_plus,(void *)temp1);
pthread_create(&tt[1],NULL,make_bitonic_minus,(void *)temp2);
pthread_join(tt[0],NULL);
pthread_join(tt[1],NULL);
}
int start=ptr,endd=ptr+n;
int x=n/2;
pthread_t *threads=new pthread_t[n/2];
while(x>0){
int k=0;
for(int i=start;i<endd;i+=2*x){
for(int j=i;j<i+x;j++)
{pair<int,int> *p=new pair<int,int>(j,j+x);
pthread_create(&threads[k++],NULL,compare_plus, (void *) p);
}

}
for(int i=0;i<n/2;i++){
pthread_join(threads[i],NULL);
}
x/=2;

}
pthread_exit(NULL);

}
int main(){
cout<<"Enter number of elements (power of 2) \n";
int n;
cin>>n;
array=new int[n];

cout<<"Enter the elements \n";


for(int i=0;i<n;i++)
cin>>array[i];
pair<int,int> *p=new pair<int,int>(0,n);
pthread_t *t=new pthread_t();
pthread_create(t,NULL,make_bitonic_plus,(void *)p);
pthread_join(*t,NULL);
for(int i=0;i<n;i++)
cout<<array[i]<<" ";

You might also like