# HG changeset patch # User Dennis C. M. # Date 1743852837 -3600 # Node ID d44c59576969b0b7dc1d92cd625f4152bf1603d4 # Parent 10a7b0e258f464a891078b90bdc7a498eebf779b# Parent 468f82bd24ac226515a70a93657f4eeb5a502f50 Merge pull request #1 from Pedritos22/main Added Merge Sort committer: GitHub diff -r 10a7b0e258f4 -r d44c59576969 src/algorithms.c --- 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; } diff -r 10a7b0e258f4 -r d44c59576969 src/algorithms.h --- 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 diff -r 10a7b0e258f4 -r d44c59576969 src/main.c --- 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]);