diff --git a/bucket.c b/bucket.c
index 95332f9f4f946077d7c89d9c9f79309cdf6252d8..c2613c4f2ca75ee5ef1016803dda78c495eca472 100644
--- a/bucket.c
+++ b/bucket.c
@@ -12,10 +12,14 @@ void insert_sort(int *data, int size);
 
 int main(int argc, char** argv) {
     
-    if (argc != 2) {
+    if (argc < 2) {
         fprintf(stderr, "Usage: num_elements\n");
         exit(1);
     }
+    if (argc == 3) {
+    	omp_set_num_threads(atoi(argv[2]));
+    }
+    
     int num_thread;
     int num_elements = atoi(argv[1]);
     // Seed the random number generator to get different results each time
@@ -26,6 +30,8 @@ int main(int argc, char** argv) {
     int max = num_elements;
     int num_range;
     int *last_idx;
+    clock_t start, end;
+    start = clock();
     #pragma omp parallel
     {
             int nthrds = omp_get_num_threads();
@@ -47,25 +53,31 @@ int main(int argc, char** argv) {
             int i;
             for(i = id; i < num_elements; i += nthrds) {
                 int dest = data[i]/num_range;
+			#pragma omp critical
                 bucket[dest][last_idx[dest]] = data[i];
                 last_idx[dest]++;
+   	
             }
     #pragma omp barrier
            insert_sort(bucket[id],last_idx[id]);
     }
-    int i,j;
+    int i, j;
     int k = 0;
     for(i = 0; i< num_thread; i++) {
         for(j = 0; j < last_idx[i]; j++) {
             data[k] = bucket[i][j];
             k++;
-            printf("%d - ",data[k-1]);
         }
     }
+    
+    //end clock
+    end = clock();
+    
     for(i =0; i < num_elements; i++) {
         printf("%d - ",data[i]);
-    }
-    
+    } printf("\n");
+    printf("Jumlah thread : %d",num_thread);
+    printf( "\nTime: %f\n", (end-start)/(double)CLOCKS_PER_SEC );
     
     free(data);
     free(last_idx);
@@ -73,6 +85,7 @@ int main(int argc, char** argv) {
         free(bucket[i]);
     }
     free(bucket);
+    
     return 0;
 }