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;
+}
+