Mercurial > public > algo-animator
annotate src/algorithms.c @ 31:61104b22a25d
I think it is working now...
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Thu, 29 Jun 2023 18:05:22 +0100 |
parents | f945bcc3571f |
children | 8ed1256dd518 |
rev | line source |
---|---|
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
1 #include "algorithms.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 |
30 | 4 /* Bubble sort */ |
5 | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
6 void *bubble_sort(void *arguments) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
7 struct AlgoArgs *args = (struct AlgoArgs *)arguments; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
8 |
30 | 9 for (int step = 0; step < args->arr_size - 1; step++) { |
10 int swapped = false; | |
11 | |
12 for (int i = 0; i < args->arr_size - step - 1; i++) { | |
13 args->comparisons++; | |
14 args->arr[i].current = true; | |
15 args->arr[i + 1].current = true; | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
16 |
30 | 17 if (args->arr[i].value > args->arr[i + 1].value) { |
18 swap_elements(i, i + 1, args->arr); | |
19 swapped = true; | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
20 } |
30 | 21 |
22 control_flow(args->delay, args->sequentially, &args->pause); | |
23 args->arr[i].current = false; | |
24 args->arr[i + 1].current = false; | |
25 } | |
26 | |
27 if (swapped == 0) { | |
28 break; | |
29
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 } |
30 | 32 |
33 | |
34 /* Selection sort */ | |
35 | |
36 void *selection_sort(void *arguments) { | |
37 struct AlgoArgs *args = (struct AlgoArgs *)arguments; | |
38 | |
39 for (int step = 0; step < args->arr_size - 1; step++) { | |
40 int min_idx = step; | |
41 | |
42 for (int i = step + 1; i < args->arr_size; i++) { | |
43 args->comparisons++; | |
44 args->arr[i].current = true; | |
31
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
45 args->arr[min_idx].current = true; |
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
46 |
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
47 control_flow(args->delay, args->sequentially, &args->pause); |
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
48 args->arr[i].current = false; |
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
49 args->arr[min_idx].current = false; |
30 | 50 |
51 if (args->arr[i].value < args->arr[min_idx].value) { | |
52 min_idx = i; | |
53 } | |
54 | |
55 } | |
56 | |
57 swap_elements(min_idx, step, args->arr); | |
58 } | |
59 } | |
60 | |
61 | |
62 /* Quick sort */ | |
63 | |
64 |