diff --git a/laporan.txt b/laporan.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d439a94cc4fc077fe2482a643be8b1ccf4ecc30f
--- /dev/null
+++ b/laporan.txt
@@ -0,0 +1,78 @@
+perbandingan waktu kinerja program
+
+1)
+N = 50.000, M = 1
+t = 2240 ms
+
+N = 50.000, M = 8
+t = 580 ms
+
+N = 50.000, M = 16
+t = 450 ms
+
+N = 50.000, M = 32
+t = 460 ms
+
+N = 50.000, M = 64
+t = 780 ms
+
+N = 50.000, M = 128
+t = 140 ms
+
+2)
+N = 100.000, M = 1
+t = 8630 ms
+
+N = 100.000, M = 8
+t = 1440 ms
+
+N = 100.000, M = 16
+t = 1080 ms
+
+N = 100.000, M = 32
+t = 1130 ms
+
+N = 100.000, M = 64
+t = 1190 ms
+
+N = 100.000, M = 128
+t = 360 ms
+
+3)
+N = 200.000, M = 1
+t = 32500 ms
+
+N = 200.000, M = 8
+t = 5160 ms
+
+N = 200.000, M = 16
+t = 3140 ms
+
+N = 200.000, M = 32
+t = 2410 ms
+
+N = 200.000, M = 64
+t = 2330 ms
+
+N = 200.000, M = 128
+t = 840 ms
+
+4)
+N = 400.000, M = 1
+t = 132480 ms
+
+N = 400.000, M = 8
+t = 18430 ms
+
+N = 400.000, M = 16
+t = 10020 ms
+
+N = 400.000, M = 32
+t = 8060 ms
+
+N = 400.000, M = 64
+t = 6720 ms
+
+N = 400.000, M = 128
+t = 3450 ms
+
diff --git a/omp_bucketsort b/omp_bucketsort
new file mode 100755
index 0000000000000000000000000000000000000000..3283b4940a935f5759e9c704190e085f2d24b541
Binary files /dev/null and b/omp_bucketsort differ
diff --git a/omp_bucketsort.c b/omp_bucketsort.c
new file mode 100644
index 0000000000000000000000000000000000000000..307ef2b6ceda226d72c914c27ad77ce9bbd546d8
--- /dev/null
+++ b/omp_bucketsort.c
@@ -0,0 +1,88 @@
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <string.h>
+#include <time.h> 
+#include <math.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 insertionSort(int *arr, int indeksAwal, int indeksAkhir){
+	int i,j;
+    int value;
+    for(i=indeksAwal+1;i<=indeksAkhir;i++)
+    {
+        value=arr[i];
+        j=i-1;
+        while(j>=indeksAwal && value<arr[j])
+        {
+            arr[j+1]=arr[j];
+            j=j-1;
+        }
+        arr[j+1]=value;
+    }
+}
+
+int main(int argc, char** argv){
+	if(argc != 3){
+		fprintf(stderr, "Usage: avg num_elements\n");
+		exit(1);
+	}
+	
+	int i;
+	srand(time(NULL));
+	int thread_count = atoi(argv[1]);
+	int num_elements = atoi(argv[2]);
+	
+	int *rand_nums = create_rand_nums(num_elements);
+	time_t start_t;
+	start_t  = clock(); 
+	int *bucket = (int*)malloc(sizeof(int) * num_elements); // bucket utama yang berisi bucket-bucket dibagi setiap elemen
+	int *indeks = (int*)malloc(sizeof(int) * thread_count); // menandakan indeks awal setiap bucket pada bucket utama
+	int range = (num_elements + thread_count) / thread_count;
+	int* jumlahElemenBucket = NULL; // jumlah elemen setiap bucket
+	jumlahElemenBucket = (int *)malloc(sizeof(int) * thread_count);
+	memset(jumlahElemenBucket,0,sizeof(int) * thread_count);
+	for(i = 0; i < num_elements; ++i){
+		jumlahElemenBucket[rand_nums[i]/range]++;
+	}
+	for(i = 0; i < thread_count; ++i){
+		if(i == 0){
+			indeks[i] = 0;
+		} else {
+			indeks[i] = indeks[i-1] + jumlahElemenBucket[i-1];
+		}
+	}
+	memset(jumlahElemenBucket,0,sizeof(int) * thread_count);
+	for(i = 0; i < num_elements; ++i){
+		int indeksBucket = rand_nums[i]/range;
+		bucket[indeks[indeksBucket] + (jumlahElemenBucket[indeksBucket]++)] = rand_nums[i];
+	}
+	#pragma omp parallel for num_threads(thread_count)
+	for(i = 0; i < thread_count; ++i){
+		if(jumlahElemenBucket[i] != 0){
+			insertionSort(bucket,indeks[i],indeks[i]+jumlahElemenBucket[i]-1);
+		}
+	}
+	printf("\n");
+	for(i = 0; i < num_elements; ++i){
+		printf("%d\n",bucket[i]);
+	}
+	time_t finish_t = clock();
+	printf("Waktu eksekusi %d data : %d thread : %.5f ms\n", num_elements, thread_count, (double)(finish_t-start_t)*1000/CLOCKS_PER_SEC);
+
+	free(rand_nums);
+	free(bucket);
+	free(indeks);
+	free(jumlahElemenBucket);
+	return 0;
+}