diff --git a/src/radix b/src/radix
new file mode 100755
index 0000000000000000000000000000000000000000..96fa5d815092724e0fa1314f38188df9cf816c1e
Binary files /dev/null and b/src/radix differ
diff --git a/src/radix_cuda.cu b/src/radix_cuda.cu
new file mode 100644
index 0000000000000000000000000000000000000000..244fd0d6eba81114b44e92667fa2ecb84a771174
--- /dev/null
+++ b/src/radix_cuda.cu
@@ -0,0 +1,135 @@
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <omp.h>
+  #include <sys/time.h>
+
+  int getMax(int arr[], int n);
+  void countSort(int arr[], int n, int digit, int thread_size);
+  void radixsort(int arr[], int n, int thread_size);
+  void generateArray(int arr[], int n,int seed);
+  void print(int arr[], int n);
+
+  __global__
+  void hitungDigit(int arr[], int n, long digit, int count[]){
+    int i;
+    int index = threadIdx.x;
+    int stride = blockDim.x;
+    for (i = index; i < n; i+=stride){
+      count[ (arr[i]/digit)%10 ] = count[ (arr[i]/digit)%10 ] + 1; 
+    }
+
+  }
+
+  int main(int argc, char *argv[]) {
+    if (argc != 3) {
+      printf("Usage: <program> <ukuran array> <jumlah thread>\n");
+      exit(0);
+    }
+    int array_size = strtol(argv[1], NULL, 10);
+    int thread_size = strtol(argv[2], NULL, 10);
+
+    struct timeval stop, start;
+    int * arr; 
+    cudaMallocManaged(&arr, array_size*sizeof(int));
+    int seed = 13515022;
+    generateArray(arr,array_size,seed);
+    gettimeofday(&start, NULL);
+    radixsort(arr, array_size, thread_size); 
+    gettimeofday(&stop, NULL);
+
+    printf("After sort:\n"); 
+    print(arr, array_size); 
+
+    printf("Membutuhkan %lu microsecond untuk eksekusi radix sort secara serial\n", ((stop.tv_sec - start.tv_sec)*1000000)+(stop.tv_usec - start.tv_usec));
+
+    cudaFree(arr);
+    return 0;
+  }
+
+
+  int getMax(int arr[], int n) { 
+    int max = arr[0]; 
+    for (int i = 1; i < n; i++){
+        if (arr[i] > max) {
+        max = arr[i]; 
+        }
+    }		
+    return max; 
+  } 
+
+  void generateArray(int arr[], int n,int seed){
+    int output[n];
+    srand(seed);
+    for(long i = 0; i < n; i++) {
+          output[i] = (int)rand();
+    }
+
+    for(long i = 0; i < n; i++) {
+        arr[i] = output[i];
+    }
+
+  }
+
+
+  void countSort(int arr[], int n, long digit, int thread_size) { 
+    int output[n];
+    long i;
+    int * count_global; 
+    
+    
+    cudaMallocManaged(&count_global, 10*sizeof(int));
+
+    for (int x = 0;x<10;x++) {
+      count_global[x] = 0;
+    }
+
+    hitungDigit<<<1,thread_size>>>(arr,n,digit,count_global);  
+    cudaDeviceSynchronize();  
+
+
+
+    for (i = 1; i < 10; i++){
+      count_global[i] += count_global[i - 1]; 
+    }
+    for (i = n - 1; i >= 0; i--){ 
+      output[count_global[ (arr[i]/digit)%10 ] - 1] = arr[i]; 
+      count_global[ (arr[i]/digit)%10 ]--; 
+    } 
+    for (i = 0; i < n; i++) {
+      arr[i] = output[i]; 
+    }
+    // printf("Count before free: ");  
+    // for (i = 0;i<10;i++) {
+    //   printf("%d ",count_global[i]);
+    // }
+    // printf("\n");
+
+    cudaFree(count_global);
+
+    // printf("Count after free: ");  
+    // for (i = 0;i<10;i++) {
+    //   printf("%d ",count_global[i]);
+    // }
+    // printf("\n");    
+  } 
+
+
+  void radixsort(int arr[], int n, int thread_size) { 
+    printf("Before sort:\n");
+    print(arr,n);
+    int m = getMax(arr, n); 
+    for (long digit = 1; m/digit > 0; digit *= 10) {
+      printf("Array before this sort, digit %ld:\n",digit);
+      print(arr,n);
+      countSort(arr, n, digit, thread_size); 
+      printf("Array after this sort:\n");
+      print(arr,n);
+    }		
+  } 
+
+  void print(int arr[], int n) { 
+    for (long i = 0; i < n; i++) {
+        printf("%d \n",arr[i]);
+    }
+    printf("\n");
+  } 
diff --git a/src/radix_sort_serial.c b/src/radix_sort_serial.c
new file mode 100644
index 0000000000000000000000000000000000000000..0ac1587774f97dc09b7f81f09e286cfecb2435d1
--- /dev/null
+++ b/src/radix_sort_serial.c
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <omp.h>
+#include <sys/time.h>
+
+int getMax(int arr[], int n);
+void countSort(int arr[], int n, int exp);
+void radixsort(int arr[], int n);
+void generateArray(int arr[], int n,int seed);
+void print(int arr[], int n);
+
+int main(int argc, char *argv[]) {
+  printf("%d\n",argc);
+  int array_size = strtol(argv[1], NULL, 10);
+
+  struct timeval stop, start;
+  int arr[array_size]; 
+  int seed = 13515022;
+  generateArray(arr,array_size,seed);
+  gettimeofday(&start, NULL);
+  radixsort(arr, array_size); 
+  gettimeofday(&stop, NULL);
+
+  printf("After sort:\n"); 
+  print(arr, array_size); 
+
+  printf("Membutuhkan %lu microsecond untuk eksekusi radix sort secara serial\n", ((stop.tv_sec - start.tv_sec)*1000000)+(stop.tv_usec - start.tv_usec));
+
+  return 0;
+}
+
+
+int getMax(int arr[], int n) { 
+	int max = arr[0]; 
+	for (int i = 1; i < n; i++){
+      if (arr[i] > max) {
+			max = arr[i]; 
+      }
+   }		
+	return max; 
+} 
+
+void generateArray(int arr[], int n,int seed){
+   int output[n];
+   srand(seed);
+   for(long i = 0; i < n; i++) {
+        output[i] = (int)rand();
+   }
+
+   for(long i = 0; i < n; i++) {
+      arr[i] = output[i];
+   }
+
+}
+
+
+void countSort(int arr[], int n, int digit) { 
+	int output[n];
+  long i;
+	int count[10] = {0}; 
+  for (i = 0; i < n; i++){
+    count[ (arr[i]/digit)%10 ]++; 
+  }
+
+  for (i = 1; i < 10; i++){
+		count[i] += count[i - 1]; 
+  }
+  for (i = n - 1; i >= 0; i--){ 
+    output[count[ (arr[i]/digit)%10 ] - 1] = arr[i]; 
+		count[ (arr[i]/digit)%10 ]--; 
+  } 
+  for (i = 0; i < n; i++) {
+		arr[i] = output[i]; 
+  }
+} 
+
+
+void radixsort(int arr[], int n) { 
+  printf("Before sort:\n");
+  print(arr,n);
+	int m = getMax(arr, n); 
+	for (int digit = 1; m/digit > 0; digit *= 10) {
+      countSort(arr, n, digit); 
+  }		
+} 
+
+void print(int arr[], int n) { 
+	for (long i = 0; i < n; i++) {
+      printf("%d \n",arr[i]);
+   }
+   printf("\n");
+}