/* merge sort */ #include #include #include #define N 1000000 void showElapsed(int id, char *m); void showVector(int *v, int n, int id); int * merge(int *A, int asize, int *B, int bsize); void swap(int *v, int i, int j); void m_sort(int *A, int min, int max); double startT,stopT; double startTime; void showElapsed(int id, char *m) { printf("%d: %s %f secs\n",id,m,(clock()-startTime)/CLOCKS_PER_SEC); } void showVector(int *v, int n, int id) { int i; printf("%d: ",id); for(i=0;i= asize) for (i = ci; i < csize; i++, bi++) C[i] = B[bi]; else if (bi >= bsize) for (i = ci; i < csize; i++, ai++) C[i] = A[ai]; for (i = 0; i < asize; i++) A[i] = C[i]; for (i = 0; i < bsize; i++) B[i] = C[asize+i]; /* showVector(C, csize, 0); */ return C; } void swap(int *v, int i, int j) { int t; t = v[i]; v[i] = v[j]; v[j] = t; } void m_sort(int *A, int min, int max) { int *C; /* dummy, just to fit the function */ int mid = (min+max)/2; int lowerCount = mid - min + 1; int upperCount = max - mid; /* If the range consists of a single element, it's already sorted */ if (max == min) { return; } else { /* Otherwise, sort the first half */ m_sort(A, min, mid); /* Now sort the second half */ m_sort(A, mid+1, max); /* Now merge the two halves */ C = merge(A + min, lowerCount, A + mid + 1, upperCount); } } main(int argc, char **argv) { int * data; int * chunk; int * other; int m,n=N; int id,p; int s = 0; int i; int step; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&id); MPI_Comm_size(MPI_COMM_WORLD,&p); startT = clock(); if(id==0) { int r; srandom(clock()); s = n/p; r = n%p; data = (int *)malloc((n+s-r)*sizeof(int)); for(i=0;i