1+ #include " ../include/SortAlgorithms.h"
2+
3+ // Implies 4 memory accesses
4+ void swap (int &a, int &b) {
5+ int aux = a;
6+ a = b;
7+ b = aux;
8+ }
9+
10+ // O(N^2)
11+ void selection_sort (class VisualWindow &window) {
12+
13+ VisualVector *vector = window.getVisualVector ();
14+ Event e{};
15+ int length = vector->getLength ();
16+ // Main loop
17+ for (int i = 0 ; i < length && window.isOpen (); i++) {
18+ // Window handler
19+ while (window.pollEvent (e)) {
20+ // Window closed
21+ if (e.type == Event::Closed) {
22+ window.close ();
23+ exit (0 );
24+ }
25+ }
26+
27+ // With two variables (one for the minimum value and one for its index) we managed to halve the
28+ // number of memory accesses of the algorithm
29+ int minimum = (*vector)[i];
30+ int minumum_index = i;
31+ // Search for the minimum
32+ for (int j = i + 1 ; j < length; j++) {
33+ if ((*vector)[j] < minimum) {
34+ minimum = (*vector)[j];
35+ minumum_index = j;
36+ vector->addArrayAccesses (1 );
37+ }
38+ }
39+ // Variable swap
40+ if (minumum_index != i) {
41+ swap ((*vector)[i], (*vector)[minumum_index]);
42+ vector->addArrayAccesses (4 );
43+ vector->addSwaps (1 );
44+ }
45+
46+ // Adding remaining numComparisons and numArrayAccesses
47+ vector->addComparisons (length - i);
48+ vector->addArrayAccesses (length - i);
49+
50+ // Set a status for exchanged boxes
51+ vector->setStatus (i, CHANGED);
52+ vector->setStatus (minumum_index, SELECTED);
53+
54+ // Draw the current frame
55+ window.drawAndDisplay ();
56+ }
57+ }
58+
59+ // O(N^2)
60+ void bubble_sort (class VisualWindow &window) {
61+
62+ VisualVector *vector = window.getVisualVector ();
63+ Event e{};
64+ int length = vector->getLength ();
65+ // Main loop
66+ for (int i = 0 ; i < length - 1 && window.isOpen (); i++) {
67+ // Window handler
68+ while (window.pollEvent (e)) {
69+ // Window closed
70+ if (e.type == Event::Closed) {
71+ window.close ();
72+ exit (0 );
73+ }
74+ }
75+
76+ for (int j = 0 ; j < length - i - 1 ; j++) {
77+ if ((*vector)[j] > (*vector)[j+1 ]) {
78+ swap ((*vector)[j],(*vector)[j+1 ]);
79+ vector->addArrayAccesses (4 );
80+ vector->addSwaps (1 );
81+
82+ // Adding remaining numComparisons and numArrayAccesses
83+ vector->addComparisons (length - i);
84+ vector->addArrayAccesses (length - i);
85+
86+ // Set a status for exchanged boxes
87+ vector->setStatus (j, CHANGED);
88+ vector->setStatus (j + 1 , SELECTED);
89+
90+ }
91+
92+ }
93+
94+ // Draw the current frame
95+ window.drawAndDisplay ();
96+ }
97+ }
0 commit comments