annotate src/utils.c @ 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 61104b22a25d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
1 #include "utils.h"
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
2
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
3
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
4 void create_array(struct Element *arr, int arr_size, int window_height, int vpadding) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
5 float rect_increase = (window_height - vpadding * 2) / (float)(arr_size - 1);
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
6 for (int i = 1; i <= arr_size; i++) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
7 arr[i - 1].value = i * rect_increase;
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
8 arr[i - 1].current = false;
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
9 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
10 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
11
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
12
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
13 void swap_elements(int x, int y, struct Element *arr) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
14 struct Element temp = arr[x];
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
15 arr[x] = arr[y];
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
16 arr[y] = temp;
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
17 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
18
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
19
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
20 void randomize_array(struct Element *arr, int arr_size) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
21 srand(time(NULL));
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
22
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
23 // Fisher-Yates shuffle
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
24 for (int i = arr_size - 1; i > 0; i--) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
25 int j = rand() % (i + 1);
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
26
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
27 // Swap
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
28 swap_elements(i, j, arr);
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
29 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
30 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
31
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
32
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
33 void algorithm_selector(struct Algo *algos, int size, int direction, int *selected_algo) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
34 int selection = *selected_algo + direction;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
35
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
36 if (selection >= 0 && selection <= size - 1) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
37 *selected_algo = selection;
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
38 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
39 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
40
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
41
31
61104b22a25d I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents: 30
diff changeset
42 void change_delay(struct AlgoArgs *algo_args, int change) {
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
43 int new_delay = algo_args->delay + change;
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
44
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
45 if (new_delay) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
46 algo_args->delay = new_delay;
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
47 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
48 }
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
49
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
50
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
51 void control_flow(useconds_t delay, bool sequentially, bool *pause) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
52 if (sequentially) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
53 *pause = true;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
54 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
55
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
56 while (*pause) {
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
57 // Wait to resume
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
58 }
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
59
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
60 usleep(delay);
29
dae463bbf5ca implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
61 }
30
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
62
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
63
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
64 void reset_state(struct AlgoArgs *algo_args, struct ThreadState *thread_state) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
65 if (thread_state->running) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
66 pthread_cancel(thread_state->thread);
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
67 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
68
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
69 randomize_array(algo_args->arr, algo_args->arr_size);
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
70
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
71 algo_args->comparisons = 0;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
72 algo_args->pause = false;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
73 algo_args->sequentially = false;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
74
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
75 for (int i = 0; i < algo_args->arr_size - 1; i++) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
76 algo_args->arr[i].current = false;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
77 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
78 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
79
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
80
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
81 void run(struct AlgoArgs *algo_args, struct Algo *algos, int selected_algo,
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
82 struct ThreadState *thread_state) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
83
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
84 if (algo_args->pause) {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
85 algo_args->pause = false;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
86 } else {
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
87 thread_state->running = true;
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
88 pthread_create(&(thread_state->thread), NULL, algos[selected_algo].function,
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
89 (void *)algo_args);
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
90 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
91 }
f945bcc3571f refactor
Dennis C. M. <dennis@denniscm.com>
parents: 29
diff changeset
92