changeset 49:cc6b3eeb0ad0

Update algorithms.c Added merge_sort.c committer: GitHub <noreply@github.com>
author Pietro Molendys <89810437+Pedritos22@users.noreply.github.com>
date Wed, 02 Apr 2025 00:38:48 +0200
parents 10a7b0e258f4
children 62b7c457510d
files src/algorithms.c
diffstat 1 files changed, 58 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/algorithms.c	Wed Nov 20 08:41:58 2024 +0000
+++ b/src/algorithms.c	Wed Apr 02 00:38:48 2025 +0200
@@ -183,5 +183,62 @@
 /* Merge sort (PENDING) */
   
 void *merge_sort(void *arguments) {
-	struct AlgoArgs *args = (struct AlgoArgs *)arguments;
+    struct AlgoArgs *args = (struct AlgoArgs *)arguments;
+    int n = args->arr_size;
+    struct Element *temp = malloc(n * sizeof(struct Element));
+    if (!temp) return NULL;
+
+    for (int curr_size = 1; curr_size < n; curr_size *= 2) {
+        for (int left_start = 0; left_start < n; left_start += 2 * curr_size) {
+            int mid = left_start + curr_size - 1;
+            if (mid >= n) mid = n - 1;
+            int right_end = left_start + 2 * curr_size - 1;
+            if (right_end >= n) right_end = n - 1;
+
+            int i = left_start;
+            int j = mid + 1;
+            int k = left_start;
+
+            while (i <= mid && j <= right_end) {
+                args->comparisons++;
+                args->arr[i].current = true;
+                args->arr[j].current = true;
+
+                control_flow(args->delay, args->sequentially, &args->pause);
+
+                if (args->arr[i].value <= args->arr[j].value) {
+                    temp[k++] = args->arr[i++];
+                } else {
+                    temp[k++] = args->arr[j++];
+                }
+
+                args->arr[i-1].current = false;
+                args->arr[j-1].current = false;
+            }
+
+            while (i <= mid) {
+                temp[k++] = args->arr[i];
+                args->arr[i].current = true;
+                control_flow(args->delay, args->sequentially, &args->pause);
+                args->arr[i++].current = false;
+            }
+
+            while (j <= right_end) {
+                temp[k++] = args->arr[j];
+                args->arr[j].current = true;
+                control_flow(args->delay, args->sequentially, &args->pause);
+                args->arr[j++].current = false;
+            }
+
+            for (int k = left_start; k <= right_end; k++) {
+                args->arr[k] = temp[k];
+                args->arr[k].current = true;
+                control_flow(args->delay, args->sequentially, &args->pause);
+                args->arr[k].current = false;
+            }
+        }
+    }
+
+    free(temp);
+    return NULL;
 }