De la tastatura se dau: n (nr de elemente), x (numarul cautat) si p (numarul de procesoare); se genereaza apoi n numere naturale intr-un vector care se ordoneaza folosind quicksort si pe care se va face cautarea paralela. Pozitia afisata reprezinta pozitia in acest vector ordonat.
#include "omp.h"#include "stdio.h"#include "stdlib.h"int min (int a, int b) {if (a < b)return a;return b;}int comp (const void * a,const void * b) {if (*((int*)a)==*((int*)b))return 0;if (*((int*)a) < *((int*)b))return -1;return 1;}void cautare (int x, int a[], int n, int left, int right, int p) {int pas = (right-left)/p+1;int i, aux = -1;if(left == right && a[left]==x)return ;#pragma omp parallel private(i) num_threads(p){#pragma omp forfor(i = left; i<=right; i+=pas) {int tid = omp_get_thread_num();int next = min (n-1, i+pas-1);if(a[i]<=x && x <= a[next]) {aux = i;if (i != next)printf ("Thread %d a gasit: intre pozitiile %d si %d\n", tid, i, next);elseprintf ("Thread %d a gasit pozitia = %d\n", tid, i);}}}if(aux >= 0)cautare (x,a,n,aux,aux+pas-1,p);elseprintf ("Element inexistent\n");}int main() {int *a, n, i, p, x;unsigned int iseed = (unsigned int)time(NULL);srand (iseed);printf ("n=");scanf ("%d", &n);a = (int *)malloc (n*sizeof(int));for (i=0; i < n; i++)a[i] = rand () % 1000;// sortare aqsort((void*)a, n, sizeof(int), comp);printf ("Multime: {");for (i=0; i < n-1; i++)printf ("%d, " , a[i]);printf ("%d}\n", a[n-1]);printf ("x=");scanf ("%d", &x);printf ("p=");scanf ("%d", &p);cautare (x,a,n,0,n-1,p);return 0;}
Niciun comentariu:
Trimiteți un comentariu