diff --git a/bucketSort.c b/bucketSort.c new file mode 100644 index 0000000000000000000000000000000000000000..cbbabb09e2b453cf3152600107d2b3571b522a26 --- /dev/null +++ b/bucketSort.c @@ -0,0 +1,115 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <mpi.h> +#include <assert.h> + +int n, maxn; +int m[1000100]; +int sub[100][1000100]; +int subSize[100]; + +int limit[20]; + +int i,j; + +int main(int argc, char** argv) { + MPI_Init(NULL, NULL); + + int world_rank, world_size; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + MPI_Status stat; + + srand(time(NULL)); + double startTime,endTime; + + if (world_rank == 0) { + scanf("%d", &n); + maxn = n; + for (i = 0; i < n; i++) { + m[i] = rand() % maxn; + } + + startTime = MPI_Wtime(); + int maxi = 0; + for (i = 0; i < n; i++) { + if (maxi < m[i]) { + maxi = m[i]; + } + } + + for (i = 0; i < world_size; i++) { + limit[i] = maxi * i / world_size; + } + + for (i = 0; i < n; i++) { + for (j = world_size - 1; j > 0; j--) { + if (m[i] >= limit[j-1]) { + sub[j][subSize[j]] = m[i]; + subSize[j]++; + break; + } + } + } + + for (i = 0; i < world_size; i++) { + for (j = 0; j < subSize[i]; j++) { + MPI_Send(&sub[i][j], 1, MPI_INT, i, 2, MPI_COMM_WORLD); + } + } + + for (i = 0; i < world_size; i++) { + MPI_Send(&subSize[i], 1, MPI_INT, i, 1, MPI_COMM_WORLD); + } + } + + int localSize; + MPI_Recv(&localSize, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &stat); + + int localArray[1000100]; + for (i = 0; i < localSize; i++) { + MPI_Recv(&localArray[i], 1, MPI_INT, 0, 2, MPI_COMM_WORLD, &stat); + } + + for (i = 0; i < localSize; i++) { + for (j = i+1; j < localSize; j++) { + if (localArray[i] > localArray[j]) { + int tmp = localArray[i]; + localArray[i] = localArray[j]; + localArray[j] = tmp; + } + } + } + + for (i = 0; i < localSize; i++) { + MPI_Send(&localArray[i], 1, MPI_INT, 0, 3, MPI_COMM_WORLD); + } + + if (world_rank == 0) { + for (i = 0; i < world_size; i++) { + for (j = 0; j < subSize[i]; j++) { + MPI_Recv(&sub[i][j], 1, MPI_INT, i, 3, MPI_COMM_WORLD, &stat); + } + } + + int it = 0; + for (i = 0; i < world_size; i++) { + for (j = 0; j < subSize[i]; j++) { + m[it++] = sub[i][j]; + } + } + endTime = MPI_Wtime(); + + for (i = 0; i < n; i++) { + printf("%d ", m[i]); + } + printf("\n"); + printf("total time: %.5lf\n", endTime - startTime); + } + + MPI_Finalize(); + return 0; +} +