diff --git a/bucketsort.c b/bucketsort.c
index 0cc104aa7055d256b583c9cf9add17b9db3acdb9..6c6ee1100050125ee7e26a50b63ddc40eab6b16f 100644
--- a/bucketsort.c
+++ b/bucketsort.c
@@ -1,82 +1,137 @@
 #include <stdio.h>
+#include <mpi.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
 
-int main()
+int main(int e)
 {
-    int n, array[1000], c, d, b, t;
-    int bucket[500000];
-    bucket buckets[n];
-    printf("Enter number of elements\n");
-    scanf("%d", &n);
+    int b, rank;
+    int *buckets; int *array;
     
-    printf("Enter number of buckets\n");
-    scanf("%d", &b);
-     
-    printf("Enter %d integers\n", n);
+	MPI_Comm_size(MPI_COMM_WORLD, &b);
+	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+	
+	array = malloc(sizeof(int*) * e);
+	//Random nilai array
+	srand(time(NULL));
+	for(int i=0; i<e; i++) {
+		array[i] = rand();
+	}
+	
+	buckets = bucketSort(array, b);
     
-    for (c = 0; c < n; c++) {
-        scanf("%d", &array[c]);
-    }
-    
-    buckets = bucketSort(array,b);
-    return 0;
+    MPI_Finalize();
 }
 
-int getSize(int[] array)
-{
+int getSize(int	*array) {
     int n = 0;
-    int i = 0;
-    while (array[i] != NULL)
-    {
+	
+    while (array[n]) {
         n++;
-        i++;
     }
     return n;
 }
+	int max;
+	max = array[0];
+	
+	for(int i=1; i<n; i++) {
+		if(array[i] > max) {
+			max = array
+		}
+	}
+	
+	return max;
+}
 
-int bucketSort(int[] array, int n)
-{
-    int bucket[500000];
-    bucket buckets[n];
-    int k;
-    int arrsize = getSize(array);
-    for (int i = 0; i <= n-1; i++) 
-    {
+int *bucketSort(int *array, int n) { //n adalah jumlah bucket
+    int **buckets; //Isi bucket
+    int k; //rentang nilai isi bucket
+    int arrsize; //panjang array
+	int count; //Untuk menentukan nomor cell pada bucket tertentu
+	
+	//openMPI Scatterv requirements
+	int *sendbuf; //bucket yang sudah disortir dan akan di-return
+	int *sendcounts;
+	int *displs;
+	
+	sendcounts = malloc(sizeof(int*) * n);
+	displs = malloc(sizeof(int*) * n);
+	
+	arrsize = getSize(array);
+	
+	count = malloc(sizeof(int *) * n);
+	buckets = malloc(sizeof(int *) * n);
+	for(int i=0; i<n; i++) {
+		count[i] = 0;
+		buckets[i] = malloc(sizeof(int *) * arrsize);
+	}
+	
+	//Menghitung rentang nilai bucket
+	if(((max-min+1)%n) > 0) {
+		k = ((max-min+1)/n) + 1;
+	} else {
+		k = ((max-min+1)/n);
+	}
+	
+	//Mengisi array ke bucket yang sesuai
+    for (int i = 0; i<arrsize; i++) {
         int m; //nomor bucket
-        int x; //menghitung mod
-        m = array[i]/k;
-        x = array[i]%k;
-        if(x>0) {
-            int c;
-            c = getSize(buckets[m+1]);
-            buckets[m+1][c+1] = array[i];
-        } else {
-            int c;
-            c = getSize(buckets[m+1]);
-            bucket[m][c+1] = array[i];
-        }
-        
-    }
-    for (int i = 0; i <= n-1; i++)
-    {
-        nextSort(buckets[i]);
+		
+		m = array[i]/k;
+		buckets[m][count[m]] = array[i];
+		
+		count[m]++;
     }
-    return buckets;
+	
+	for(int i=0; i<n; i++) {
+		sendcounts[i] = count[i];
+	}
+	
+	displs[0] = 0;
+	for(int i=1; i<n; i++) {
+		displs[i] = displs[i-1] + count[i-1];
+	}
+	
+	for(int i=0; i<n; i++) {
+		memcpy(sendbuf + displs[i], buckets[i], count[i];
+		free(buckets[i]);
+	}
+	free(buckets);
+	
+	return sendbuf;
+	
+	//Melakukan pengurutan nilai setiap bucket ke openMPI
+	
+	MPI_Scatterv(sendbuf, sendcounts, displs,
+    MPI_int, 8recvbuf, int recvcount,
+    MPI_Datatype recvtype, 0, MPI_Comm comm);
 }
 
-void nextSort(int[] array)
-{    
+int *bucket(int **array, int i, int count) { //i adalah nomor bucket, count adalah jumlah isi bucket
+	int *tempBucket;
+	tempBucket = malloc(sizeof(int*) * count);
+	
+	for(int j=0; j<count; j++) {
+		tempBucket[j] = array[i][count];
+	}
+	
+	return tempBucket;
+}
+
+void nextSort(int *array) {    
     int n = getSize(array);
     int d, t;
     
-    for (int c = 1 ; c <= n - 1; c++) {
-        d = c;
-    
-        while ( d > 0 && array[d] < array[d-1]) {
-        t          = array[d];
-        array[d]   = array[d-1];
-        array[d-1] = t;
+    for (int i=1 ; i <=n-1; i++) {
+        d = i;
     
-        d--;
+        while ((d > 0) && (array[d] < array[d-1])) {
+			t          = array[d];
+			array[d]   = array[d-1];
+			array[d-1] = t;
+		
+			d--;
         }
     }
 }