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