diff --git a/.swp b/.swp
new file mode 100644
index 0000000000000000000000000000000000000000..e69c7d4cda884694ea480c90b4f7d66104cd4cff
Binary files /dev/null and b/.swp differ
diff --git a/a b/a
new file mode 100755
index 0000000000000000000000000000000000000000..051132f2e423803a08736493c09679c59d6ef85e
Binary files /dev/null and b/a differ
diff --git a/bucket.c b/bucket.c
new file mode 100644
index 0000000000000000000000000000000000000000..e5448eba86dacfe67bfe490fe046af54fbce42b0
--- /dev/null
+++ b/bucket.c
@@ -0,0 +1,162 @@
+/* Copyrights http://www.programmingsimplified.com/c/source-code/c-program-insertion-sort */
+/* insertion sort ascending order */
+ 
+#include <stdio.h>
+// Copyright 2012 www.mpitutorial.com 
+ 
+// Program yang menghitung rata­rata dari array secara paralel menggunakan Scatter dan Gather. 
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <time.h> 
+#include <mpi.h> 
+#include <assert.h> 
+ 
+float *create_rand_nums(int num_elements) { 
+    float *rand_nums = (float *)malloc(sizeof(float) * num_elements); 
+    assert(rand_nums != NULL); 
+    int i; 
+    for (i = 0; i < num_elements; i++) { 
+        rand_nums[i] = (rand() / (float)RAND_MAX); 
+    } 
+    return rand_nums; 
+} 
+ 
+float compute_avg(float *array, int num_elements) { 
+    float sum = 0.f; 
+    int i; 
+    for (i = 0; i < num_elements; i++) { 
+        sum += array[i]; 
+    } 
+    return sum / num_elements; 
+} 
+ 
+int* bucketSort(int array[], int n, int argc) { 
+    int i, j;
+    int data[1000][1000];
+    int size[1000];
+    for (i=0;i<n;i++) {
+        size[i] = 0;
+    }
+    for (i=0;i<n;i++) {
+        if (array[i] < 10)
+            data[0][size[i]] = array[i];
+        size[i]++;
+    }
+    
+    MPI_Init(NULL, NULL);
+    
+    int world_rank; 
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
+    int world_size; 
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
+    
+    MPI_Scatter(data, num_elements_per_proc, MPI_FLOAT, sub_rand_nums, 
+    num_elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); 
+    
+    MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, 
+    MPI_COMM_WORLD); 
+    
+    if (world_rank == 0) { 
+        float avg = compute_avg(sub_avgs, world_size); 
+        printf("Avg of all elements is %f\n", avg); 
+    } 
+    
+    if (world_rank == 0) { 
+        free(rand_nums); 
+        free(sub_avgs); 
+    } 
+    free(sub_rand_nums); 
+    
+    MPI_Barrier(MPI_COMM_WORLD); 
+    MPI_Finalize();
+    
+    
+    int num_elements_per_proc = atoi(argv[1]); 
+    srand(time(NULL)); 
+    
+    MPI_Init(NULL, NULL); 
+    
+    int world_rank; 
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
+    int world_size; 
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
+    
+    float *rand_nums = NULL; 
+    if (world_rank == 0) { 
+        rand_nums = create_rand_nums(num_elements_per_proc * world_size); 
+    } 
+    
+    float *sub_rand_nums = (float *)malloc(sizeof(float) * 
+    num_elements_per_proc); 
+    assert(sub_rand_nums != NULL); 
+    
+    MPI_Scatter(rand_nums, num_elements_per_proc, MPI_FLOAT, sub_rand_nums, 
+    num_elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); 
+    
+    float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); 
+    
+    float *sub_avgs = NULL; 
+    if (world_rank == 0) { 
+        sub_avgs = (float *)malloc(sizeof(float) * world_size); 
+        assert(sub_avgs != NULL); 
+    } 
+    MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, 
+    MPI_COMM_WORLD); 
+    
+    if (world_rank == 0) { 
+        float avg = compute_avg(sub_avgs, world_size); 
+        printf("Avg of all elements is %f\n", avg); 
+    } 
+    
+    if (world_rank == 0) { 
+        free(rand_nums); 
+        free(sub_avgs); 
+    } 
+    free(sub_rand_nums); 
+    
+    MPI_Barrier(MPI_COMM_WORLD); 
+    MPI_Finalize(); 
+}  
+
+ 
+int main(int argc, char** argv)
+{
+    
+  int n, array[1000], c, d, t;
+  int array1[1000];
+  
+  if (argc != 2) { 
+        fprintf(stderr, "Usage: avg num_elements_per_proc\n"); 
+        exit(1); 
+    } 
+ 
+  printf("Enter number of elements\n");
+  scanf("%d", &n);
+ 
+  printf("Enter %d integers\n", n);
+ 
+  for (c = 0; c < n; c++) {
+    scanf("%d", &array[c]);
+  }
+  array1 = bucketSort(array[1000], n, argc);
+ /*
+  for (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;
+ 
+      d--;
+    }
+  }
+ */
+  printf("Sorted list in ascending order:\n");
+ 
+  for (c = 0; c <= n - 1; c++) {
+    printf("%d\n", array1[c]);
+  }
+ 
+  return 0;
+}
diff --git a/mpi_hostfile b/mpi_hostfile
new file mode 100644
index 0000000000000000000000000000000000000000..820eec6734fb3e7fc699d427076dbf7df8f7c7a1
--- /dev/null
+++ b/mpi_hostfile
@@ -0,0 +1,7 @@
+#daftar host 
+localhost 
+167.205.35.26 
+167.205.35.28 
+167.205.35.29 
+167.205.35.30 
+167.205.35.31
diff --git a/scattergather.c b/scattergather.c
new file mode 100644
index 0000000000000000000000000000000000000000..533d2215b819def46e7aa666b2531f42e1dfd7ae
--- /dev/null
+++ b/scattergather.c
@@ -0,0 +1,80 @@
+// Copyright 2012 www.mpitutorial.com 
+ 
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <time.h> 
+#include <mpi.h> 
+#include <assert.h> 
+ 
+float *create_rand_nums(int num_elements) { 
+float *rand_nums = (float *)malloc(sizeof(float) * num_elements); 
+assert(rand_nums != NULL); 
+int i; 
+for (i = 0; i < num_elements; i++) { 
+rand_nums[i] = (rand() / (float)RAND_MAX); 
+} 
+return rand_nums; 
+} 
+ 
+float compute_avg(float *array, int num_elements) { 
+float sum = 0.f; 
+int i; 
+for (i = 0; i < num_elements; i++) { 
+sum += array[i]; 
+} 
+return sum / num_elements; 
+} 
+ 
+int main(int argc, char** argv) { 
+if (argc != 2) { 
+fprintf(stderr, "Usage: avg num_elements_per_proc\n"); 
+exit(1); 
+} 
+ 
+int num_elements_per_proc = atoi(argv[1]); 
+srand(time(NULL)); 
+ 
+MPI_Init(NULL, NULL); 
+ 
+int world_rank; 
+MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
+int world_size; 
+MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
+ 
+float *rand_nums = NULL; 
+if (world_rank == 0) { 
+rand_nums = create_rand_nums(num_elements_per_proc * world_size); 
+} 
+ 
+float *sub_rand_nums = (float *)malloc(sizeof(float) * 
+num_elements_per_proc); 
+assert(sub_rand_nums != NULL); 
+ 
+MPI_Scatter(rand_nums, num_elements_per_proc, MPI_FLOAT, sub_rand_nums, 
+num_elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); 
+ 
+float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); 
+ 
+float *sub_avgs = NULL; 
+if (world_rank == 0) { 
+sub_avgs = (float *)malloc(sizeof(float) * world_size); 
+assert(sub_avgs != NULL); 
+} 
+MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, 
+MPI_COMM_WORLD); 
+ 
+if (world_rank == 0) { 
+float avg = compute_avg(sub_avgs, world_size); 
+printf("Avg of all elements is %f\n", avg); 
+} 
+ 
+if (world_rank == 0) { 
+free(rand_nums); 
+free(sub_avgs); 
+} 
+free(sub_rand_nums); 
+ 
+MPI_Barrier(MPI_COMM_WORLD); 
+MPI_Finalize(); 
+}  
+