diff --git a/openmp_bucketsort b/openmp_bucketsort
new file mode 100755
index 0000000000000000000000000000000000000000..1ad8f707c87e81627298f7248ed965232dc8a0a5
Binary files /dev/null and b/openmp_bucketsort differ
diff --git a/openmp_bucketsort_13513001_13513083.c b/openmp_bucketsort_13513001_13513083.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc3400bd20f8c91efacdb899455578718a90660a
--- /dev/null
+++ b/openmp_bucketsort_13513001_13513083.c
@@ -0,0 +1,121 @@
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <omp.h> 
+#include <assert.h>
+#include <time.h>
+
+void Hello(void); /* Thread function */ 
+
+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] = (rand() % num_elements); 
+	} 
+	return rand_nums; 
+} 
+
+void print_array(int *array, int count) {
+	int i;
+	for (i=0;i<count;i++) {
+		printf("%d  ",array[i]);
+	}
+	printf("\n");
+}
+
+
+void make_bucket(int *array,int *ar_result,int *num_res,int num_elements, int num_process,int total_process) {
+	int bagi = num_elements / total_process ;
+	int batas_bawah = (num_process)*bagi ;
+	int batas_atas = batas_bawah + bagi - 1 ;
+	if (num_process==total_process-1) batas_atas = num_elements-1 ;
+	
+	int i,num=0 ;
+	for (i=0;i<num_elements;i++) {
+		if (array[i]>=batas_bawah && array[i]<=batas_atas) {
+			ar_result[num] = array[i];
+			num++;
+		}
+	}
+	*num_res = num;
+}
+
+
+int *sort_array(int *array, int num_elements) {
+	int i,j ;
+	int temp_;
+	int *result = NULL ;
+	result = array ;
+	for (i=i;i<num_elements;i++) {
+		j=i;
+		while (j>0 && result[j] < result[j-1]) {
+			temp_ = result[j] ;
+			result[j] = result[j-1];
+			result[j-1 ] = temp_;
+			j--;
+		}
+	}
+	return result;
+}
+
+
+int main(int argc, char *argv[]) { 
+	//clock_t start_t,end_t,total_t ;
+	int thread_count = strtol(argv[1], NULL, 10); 
+	int counter=0 ;
+	int *flag_array = create_rand_nums(thread_count);
+	int k ;
+	for (k=0;k<thread_count;k++) flag_array[k] = 0;
+	int *rand_array = NULL ;
+	int *join_array = NULL ;
+	int num_element = atoi(argv[2]); 
+	rand_array = create_rand_nums(num_element);
+	join_array = create_rand_nums(num_element);
+	//printf("Start array : "); print_array(rand_array,num_element);
+	double start = omp_get_wtime();
+	//start_t = clock();
+	#pragma omp parallel num_threads(thread_count) shared(rand_array,join_array,flag_array)
+	{
+		int my_rank = omp_get_thread_num(); 
+		int thread_count = omp_get_num_threads();	
+		printf("Process %d now make bucket array \n",my_rank);
+		int *bucket_array = (int *)malloc(sizeof(int) * num_element);
+		int bucket_size =0; 
+		make_bucket(rand_array,bucket_array,&bucket_size,num_element,my_rank,thread_count);
+		printf("Process %d, bucket size %d . Now sorting\n ",my_rank,bucket_size);
+		//print_array(bucket_array,bucket_size);
+		//Sorting
+		int *bucket_sorted = (int *)malloc(sizeof(int) * bucket_size);
+		bucket_sorted = sort_array(bucket_array,bucket_size);
+		printf("Process %d finishing sorted \n",my_rank);
+		//print_array(bucket_sorted,bucket_size);
+		if (my_rank!=0) {
+			while (flag_array[my_rank-1]==0) {}
+			int i2 ;
+			for (i2=0;i2<bucket_size;i2++) {
+				join_array[counter] = bucket_sorted[i2];
+				counter++; 
+			}
+			flag_array[my_rank]=1;
+		}
+		else {
+			int i2 ;
+			for (i2=0;i2<bucket_size;i2++) {
+				join_array[counter] = bucket_sorted[i2];
+				counter++; 
+			}
+			flag_array[0]=1;
+		}
+	}
+		//end_t = clock();
+		double total_time ;
+		double end = omp_get_wtime();
+		printf("Time taken = %f \n", end - start);
+		//total_time = (double)(end_t - start_t) / CLOCKS_PER_SEC;
+		//printf("Total time taken by CPU: %f\n", total_time  );
+		//printf("Final array : \n");
+		//print_array(join_array,num_element);
+		return 0; 
+} 
+