changeset 53:d44c59576969

Merge pull request #1 from Pedritos22/main Added Merge Sort committer: GitHub <noreply@github.com>
author Dennis C. M. <dennisconcepcionmartin@gmail.com>
date Sat, 05 Apr 2025 12:33:57 +0100
parents 10a7b0e258f4 (current diff) 468f82bd24ac (diff)
children 2016dc709c7b
files
diffstat 3 files changed, 65 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/algorithms.c	Wed Nov 20 08:41:58 2024 +0000
+++ b/src/algorithms.c	Sat Apr 05 12:33:57 2025 +0100
@@ -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;
 }
--- a/src/algorithms.h	Wed Nov 20 08:41:58 2024 +0000
+++ b/src/algorithms.h	Sat Apr 05 12:33:57 2025 +0100
@@ -8,6 +8,7 @@
 void *selection_sort(void *arguments);
 void *quick_sort(void *arguments);
 void *insertion_sort(void *arguments);
+void *merge_sort(void *arguments);
 
 
 #endif // ALGORITHMS_H
--- a/src/main.c	Wed Nov 20 08:41:58 2024 +0000
+++ b/src/main.c	Sat Apr 05 12:33:57 2025 +0100
@@ -1,4 +1,6 @@
 #include "algorithms.h"
+#define GL_SILENCE_DEPRECATION
+
 
 
 int window_width = 1920;
@@ -7,7 +9,7 @@
 int rect_width = 5;
 int space = 1;
 
-struct Algo algos[4];
+struct Algo algos[5];
 int selected_algo = 0;
 int algos_size;
 
@@ -309,6 +311,9 @@
 
 	strcpy(algos[3].name, "Insertion sort");
 	algos[3].function = insertion_sort;
+
+	strcpy(algos[4].name, "Merge sort");
+	algos[4].function = merge_sort;
 	
 	algos_size = sizeof(algos) / sizeof(algos[0]);