diff --git a/bucket_sort b/bucket_sort
new file mode 100755
index 0000000000000000000000000000000000000000..1e4e663358a2dfe9eb9cbb6fed961666b918dd39
Binary files /dev/null and b/bucket_sort differ
diff --git a/bucket_sort.c b/bucket_sort.c
new file mode 100644
index 0000000000000000000000000000000000000000..a587768952e0f0c113634b7579a8084c28a0c148
--- /dev/null
+++ b/bucket_sort.c
@@ -0,0 +1,120 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <mpi.h>
+#include <assert.h>
+
+void insertion_sort(int* array, int num_elements) {
+	// Sorting array
+	int i;
+	int d;
+	int t;
+	for (i = 1; i < num_elements; i++) {
+		d = i;
+
+		while ( d > 1 && array[i] < array[d-1] ) {
+				t = array[d];
+				array[d] = array[d-1];
+				array[d-1] = t;
+
+				d--;
+		}
+	}
+}
+
+
+int cmpfunc (const void * a, const void * b)
+{
+   return ( *(int*)a - *(int*)b );
+}
+
+int main(int argc, char const *argv[]) {
+	if (argc != 2) {
+		fprintf(stderr, "Usage: avg num_elements_per_proc\n");
+		exit(1);
+	}
+
+	MPI_Init(NULL, NULL);
+
+	int BUCKET_SIZE = atoi(argv[1]); //Each Bucket size
+	int MAX_VALUE = atoi(argv[1]);
+	int i, j, k, z, iter=0;
+	time_t t;
+
+	int WORLD_RANK;
+	int WORLD_SIZE; //Number of process / Number of bucket
+	MPI_Comm_rank(MPI_COMM_WORLD, &WORLD_RANK);
+	MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
+	double begin = MPI_Wtime();
+	srand((unsigned) time(&t));
+	if (WORLD_RANK == 0) { //Initialize bucket
+		int rand_array[BUCKET_SIZE];
+		
+		for (i = 0; i < BUCKET_SIZE; i++){
+			rand_array[i] = rand() % MAX_VALUE;
+			// printf("%d\n", rand_array[i]);
+		}
+		int sum = 0;
+		int bucket[BUCKET_SIZE];
+		int low, high;
+		for (i = 1; i < WORLD_SIZE; i++){
+			for (j = 0; j < BUCKET_SIZE; j++){
+				bucket[j] = -1;
+			}
+	//		printf("%d\n", i);
+
+			for (j = 0; j < BUCKET_SIZE; j++){
+				low = (i - 1) * (MAX_VALUE/WORLD_SIZE+1);
+				high = i * (MAX_VALUE/WORLD_SIZE+1);
+				//printf("%d %d %d %d %d\n", MAX_VALUE, WORLD_SIZE, low, high, rand_array[j]);
+				if ((rand_array[j] < high) && (rand_array[j] >= low)){
+					bucket[iter] = rand_array[j];
+					sum++;
+					//printf("%d\n", bucket[iter]);
+					iter++;
+				} else {
+//					printf("%d\n", rand_array[j]);
+				}
+			}
+			//printf("AAA %d AAA\n", sum);
+
+			MPI_Send(bucket, BUCKET_SIZE, MPI_INT, i, 0, MPI_COMM_WORLD);
+			iter = 0;
+		}
+	} else {
+		int bucket_n[BUCKET_SIZE];
+		MPI_Recv(bucket_n, BUCKET_SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+		qsort(bucket_n, BUCKET_SIZE, sizeof(int), cmpfunc);
+		int lol = 0;
+		
+		MPI_Send(bucket_n, BUCKET_SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD);
+	}
+
+	if (WORLD_RANK == 0){
+		int bucket[BUCKET_SIZE];
+		int delim = 0;
+		for (i = 1; i<WORLD_SIZE; i++){
+			int bucket_n[BUCKET_SIZE];
+			//printf("%d\n", i);
+			MPI_Recv(bucket_n, BUCKET_SIZE, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+			//printf("Tulis dari proses %d\n", i);
+			for (z = 0; z < BUCKET_SIZE; z++){
+			//	printf("%d ", bucket_n[z]);
+				if (bucket_n[z] != -1){
+					bucket[delim] = bucket_n[z];
+					delim++;
+				}
+			}
+			//printf("\n");
+		}
+		//assert(delim == BUCKET_SIZE);
+		for (i = 0; i < BUCKET_SIZE; i++){
+			printf("%d\n", bucket[i]);
+		}
+
+		double end = MPI_Wtime();
+		printf("Time elapsed: %f seconds\n", end - begin);
+	}
+	MPI_Finalize();
+	return 0;
+}
diff --git a/mpi_hostfile b/mpi_hostfile
new file mode 100644
index 0000000000000000000000000000000000000000..bffbf8847866f00c5ba8aefc9d5856feb4a31cb3
--- /dev/null
+++ b/mpi_hostfile
@@ -0,0 +1,11 @@
+#daftar host 
+localhost 
+167.205.35.26 
+167.205.35.28 
+167.205.35.29 
+167.205.35.30 
+167.205.35.31 
+#167.205.35.32 
+#167.205.35.33 
+#167.205.35.34 
+