diff --git a/LaporanOpenMP.txt b/LaporanOpenMP.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e522c0f50066185733c35cc932e4b3c5484c84f6
--- /dev/null
+++ b/LaporanOpenMP.txt
@@ -0,0 +1,39 @@
+Moch Ginanjar Busiri 13513041
+Wiwit Rifa'i 13513073
+
+
+Laporan Perbandingan Waktu Bucket Sort OpenMP :
+Thread : 1
+	Data 50000 : 3690 ms
+	Data 100000 : 14260 ms
+	Data 200000 : 61810 ms
+	Data 400000 : 222600 ms
+Thread : 8
+        Data 50000 : 590 ms
+        Data 100000 : 2170
+        Data 200000 : 8140 ms
+        Data 400000 : 30600 ms
+Thread : 16
+        Data 50000 : 390 ms
+        Data 100000 : 1020 ms
+        Data 200000 : 4190 ms
+        Data 400000 : 15900 ms
+Thread : 32
+        Data 50000 : 360 ms
+        Data 100000 : 1020 ms
+        Data 200000 : 2540 ms
+        Data 400000 : 11810 ms
+Thread : 64
+        Data 50000 : 500 ms
+        Data 100000 : 1020 ms
+        Data 200000 : 2690 ms
+        Data 400000 : 8560 ms
+Thread : 128
+        Data 50000 : 60 ms  
+        Data 100000 : 290 ms
+        Data 200000 : 1260 ms
+        Data 400000 : 3360 ms
+
+
+
+
diff --git a/bucket b/bucket
new file mode 100755
index 0000000000000000000000000000000000000000..d646e97d713a3f6e3f7b59b2537067334fc95317
Binary files /dev/null and b/bucket differ
diff --git a/bucket_sort.c b/bucket_sort.c
new file mode 100644
index 0000000000000000000000000000000000000000..f384700aa432302ba530a0c021a2f52ba688d29b
--- /dev/null
+++ b/bucket_sort.c
@@ -0,0 +1,93 @@
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <string.h>
+#include <time.h> 
+#include <omp.h> 
+#include <assert.h> 
+ 
+int *create_rand_nums(int num_elements) { 
+        int *rand_nums = (int *)malloc(sizeof(int) * num_elements); 
+        assert(rand_nums != NULL); 
+        int i; 
+        for (i = 0; i < num_elements; i++) { 
+                rand_nums[i] = (abs((int)rand()) % num_elements); 
+        } 
+        return rand_nums; 
+}
+
+void insertion_sort(int *array, int a, int b)
+{
+  int c, d, t;
+  for (c = a ; c < b; c++) {
+    d = c;
+ 
+    while ( d > a && array[d] < array[d-1]) {
+      t          = array[d];
+      array[d]   = array[d-1];
+      array[d-1] = t;
+ 
+      d--;
+    }
+  }
+}
+
+ 
+int main(int argc, char** argv) { 
+        if (argc != 3) { 
+                fprintf(stderr, "Usage: bucket num_threads num_elements\n"); 
+                exit(1); 
+        } 
+ 
+        int num_elements = atoi(argv[2]);
+	int num_threads = atoi(argv[1]);
+	int range_size = (num_elements + num_threads - 1) / num_threads;
+        srand(time(NULL)); 
+ 
+        int *rand_nums = NULL; 
+        rand_nums = create_rand_nums(num_elements);
+	int * bucket_nums;
+	bucket_nums = (int *) malloc(sizeof(int) * num_elements);
+        
+	int *str, *fsh;
+	str = (int *)malloc(sizeof(int) * num_threads);
+	fsh = (int *)malloc(sizeof(int) * num_threads);
+	        
+	memset(fsh, 0, sizeof(int) * num_threads);
+	
+	time_t start_time = clock();
+
+	int i;
+	for(i = 0; i<num_elements; i++) {
+		fsh[rand_nums[i]/range_size]++;
+	}
+	int now = 0;
+	for(i = 0; i<num_threads; i++) {
+		str[i] = now;
+		now += fsh[i];
+		fsh[i] = str[i];
+	}
+	for(i = 0; i<num_elements; i++) {
+		int no_bucket = rand_nums[i]/range_size;
+		bucket_nums[fsh[no_bucket]++] = rand_nums[i];
+	}
+	
+	// Implementasi bucket sort dengan OMP
+	#pragma omp parallel for num_threads(num_threads) private(i) shared(bucket_nums,str, fsh)
+    	for (i = 0; i < num_threads; i++)
+    	{
+       		insertion_sort(bucket_nums, str[i], fsh[i]);
+    	}
+
+	
+	time_t finish_time = clock();
+	
+	for(i = 0; i<num_elements; i++)
+		printf("%d\n", bucket_nums[i]);
+        
+        printf("Bucket sort of %d with %d thread need time : %.5lf ms\n", num_elements, num_threads, (double)(finish_time-start_time)*1000/CLOCKS_PER_SEC);
+	free(str);
+	free(fsh);
+	free(rand_nums);
+	free(bucket_nums);
+	return 0;
+}