diff --git a/result/K01-03-TC1_parallel.txt b/result/K01-03-TC1_parallel.txt
index a6dd3f6a9db8ee03785586c8a82ea8b487fb8f42..621341380641e8b0258d72fc13ca768ac5a89874 100644
--- a/result/K01-03-TC1_parallel.txt
+++ b/result/K01-03-TC1_parallel.txt
@@ -3,4 +3,4 @@
 10114197
 10323010
 
-Runtime: 0.162644 s
+Runtime: 0.213774 s
diff --git a/result/K01-03-TC2_parallel.txt b/result/K01-03-TC2_parallel.txt
index b0dc0985543b3dc07f5709dff304347b6fb30550..43987c2572fa70c6a2e24590015fca773d289fa6 100644
--- a/result/K01-03-TC2_parallel.txt
+++ b/result/K01-03-TC2_parallel.txt
@@ -3,4 +3,4 @@
 37739803
 38222937
 
-Runtime: 0.871782 s
+Runtime: 0.919108 s
diff --git a/result/K01-03-TC3_parallel.txt b/result/K01-03-TC3_parallel.txt
index a2e3dcc6325c485697d7c496849571cd2ed7057f..a3f236bfec62bd72f46dfd57d491c461fc04f69d 100644
--- a/result/K01-03-TC3_parallel.txt
+++ b/result/K01-03-TC3_parallel.txt
@@ -3,4 +3,4 @@
 23198319
 23380111
 
-Runtime: 1.021110 s
+Runtime: 1.026466 s
diff --git a/result/K01-03-TC4_parallel.txt b/result/K01-03-TC4_parallel.txt
index 0392bae707c69dce16b797a597723dd0644b2ffa..0e9c566e434823660b09a9f44104a1e8a9441ff7 100644
--- a/result/K01-03-TC4_parallel.txt
+++ b/result/K01-03-TC4_parallel.txt
@@ -3,4 +3,4 @@
 51451884
 51774352
 
-Runtime: 9.808481 s
+Runtime: 10.590979 s
diff --git a/src/lib/utils.cu b/src/lib/utils.cu
index b0efc57357cbd7fe362069bacbd8b4c84396d13d..04b72a501a8acf3561aa9f00041ef8b7d984e23a 100644
--- a/src/lib/utils.cu
+++ b/src/lib/utils.cu
@@ -46,3 +46,61 @@ long get_floored_mean(int *n, int length)
 
 	return sum / length;
 }
+
+/*
+ * Procedure merge_array
+ *
+ * Merges two subarrays of n with n[left..mid] and n[mid+1..right]
+ * to n itself, with n now ordered ascendingly
+ * */
+void merge_array(int *n, int left, int mid, int right) {
+	int n_left = mid - left + 1;
+	int n_right = right - mid;
+	int iter_left = 0, iter_right = 0, iter_merged = left;
+	int *arr_left = (int *) malloc(n_left * sizeof(int));
+	int *arr_right = (int *) malloc(n_right * sizeof(int));
+
+	for (int i = 0; i < n_left; i++) {
+		arr_left[i] = n[i + left];
+	}
+
+	for (int i = 0; i < n_right; i++) {
+		arr_right[i] = n[i + mid + 1];
+	}
+
+	while (iter_left < n_left && iter_right < n_right) {
+		if (arr_left[iter_left] <= arr_right[iter_right]) {
+			n[iter_merged] = arr_left[iter_left++];
+		} else {
+			n[iter_merged] = arr_right[iter_right++];
+		}
+		iter_merged++;
+	}
+
+	while (iter_left < n_left)  {
+		n[iter_merged++] = arr_left[iter_left++];
+	}
+	while (iter_right < n_right) {
+		n[iter_merged++] = arr_right[iter_right++];
+	} 
+
+	free(arr_left);
+	free(arr_right);
+}
+
+
+/* 
+ * Procedure merge_sort
+ *
+ * Sorts array n with merge sort algorithm
+ * */
+void merge_sort(int *n, int left, int right) {
+	if (left < right) {
+		int mid = left + (right - left) / 2;
+
+		merge_sort(n, left, mid);
+		merge_sort(n, mid + 1, right);
+
+		merge_array(n, left, mid, right);
+	}	
+}
diff --git a/src/lib/utils.cuh b/src/lib/utils.cuh
index 763d092a06033825a12acdfa7768af6dcbfe7733..b0728e9c1a268b24a5ad6107a8358eceeb9cf01d 100644
--- a/src/lib/utils.cuh
+++ b/src/lib/utils.cuh
@@ -26,4 +26,20 @@ int get_median(int *n, int length);
  * */
 long get_floored_mean(int *n, int length);
 
+/*
+ * Procedure merge_array
+ *
+ * Merges two subarrays of n with n[left..mid] and n[mid+1..right]
+ * to n itself, with n now ordered ascendingly
+ * */
+void merge_array(int *n, int left, int mid, int right);
+
+
+/* 
+ * Procedure merge_sort
+ *
+ * Sorts array n with merge sort algorithm
+ * */
+void merge_sort(int *n, int left, int right);
+
 #endif
\ No newline at end of file