Skip to content

Commit bbd8a6a

Browse files
authored
Merge pull request #11 from zanliang4tz/other-colours
Sprint 3 Client feedback
2 parents 92af38c + 7517899 commit bbd8a6a

File tree

5 files changed

+113
-48
lines changed

5 files changed

+113
-48
lines changed

src/algorithms/controllers/msort_arr_bup.js

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import {
1616
displayMergeLabels,
1717
highlightAPointers,
1818
set_simple_stack,
19-
resetArrayA
19+
resetArrayA,
20+
highlightFromTo
2021
} from './msort_shared.js';
2122

2223

@@ -120,7 +121,7 @@ export function run_msort() {
120121

121122
chunker.add('runlength', (vis, c_rlength) => {
122123
assignVarToA(vis, "runlength", c_rlength - 1, size);
123-
set_simple_stack(vis.array, [c_rlength]);
124+
set_simple_stack(vis.array, [`runlength = ${c_rlength}`]);
124125
highlightAllRunlengths(vis, c_rlength, runAColor, runBColor, size);
125126
}, [runlength]);
126127

@@ -135,11 +136,11 @@ export function run_msort() {
135136
chunker.add('left', (vis, a, c_left, c_rlength) => {
136137
vis.array.set(a, 'msort_arr_bup'); // unhighlight arrayA
137138
assignVarToA(vis, 'left', c_left, size);
138-
set_simple_stack(vis.array, [c_rlength]);
139+
set_simple_stack(vis.array, [`runlength = ${c_rlength}`]);
139140
let left_2 = c_left;
140141
let mid_2 = (c_rlength + c_left - 1);
141142
let right_2 = (Math.min(c_rlength * 2, size) - 1);
142-
highlight2Runlength(vis, left_2, mid_2, right_2, runAColor, runBColor);
143+
// highlight2Runlength(vis, left_2, mid_2, right_2, runAColor, runBColor);
143144
}, [A, left, runlength]);
144145

145146
while ((left + runlength) <= size) {
@@ -149,13 +150,15 @@ export function run_msort() {
149150

150151
let mid = left + runlength - 1;
151152
let right = Math.min(mid + runlength, (size - 1));
152-
chunker.add('mid', (vis, c_mid) => {
153+
chunker.add('mid', (vis, c_mid, c_left) => {
153154
assignVarToA(vis, 'mid', c_mid, size);
154-
}, [mid]);
155-
chunker.add('right', (vis, c_right) => {
155+
highlightFromTo(vis, c_left, c_mid, runAColor);
156+
}, [mid, left]);
157+
chunker.add('right', (vis, c_right, c_mid) => {
156158
assignVarToA(vis, 'right', c_right, size);
159+
highlightFromTo(vis, c_mid + 1, c_right, runBColor);
157160

158-
}, [right]);
161+
}, [right, mid]);
159162

160163
// start merge[left, mid, right] ------------------------------------------------------------
161164
let ap1 = left;
@@ -290,7 +293,7 @@ export function run_msort() {
290293
// future color: should be runAColor & runBColor
291294
resetArrayA(vis, "bup", a, c_left, c_mid, c_right, c_rlength, runAColor, runCColor);
292295

293-
if (isMergeExpanded()) vis.arrayB.set(b, 'msort_arr_bup');
296+
if (isMergeCopyExpanded()) vis.arrayB.set(b, 'msort_arr_bup');
294297
assignVarToA(vis, 'ap2', c_ap2, size);
295298
assignVarToA(vis, 'max2', c_max2, size);
296299

@@ -307,45 +310,45 @@ export function run_msort() {
307310

308311
chunker.add('copyBA', (vis, a, b, c_left, c_right, c_rlength) => {
309312
vis.array.set(a, 'msort_arr_bup');
310-
set_simple_stack(vis.array, [c_rlength]);
313+
set_simple_stack(vis.array, [`runlength = ${c_rlength}`]);
311314

312-
if (isMergeExpanded()) vis.arrayB.set(b, 'msort_arr_bup');
315+
if (isMergeCopyExpanded()) {
316+
vis.arrayB.set(b, 'msort_arr_bup');
317+
}
313318

314319
// highlight all sorted elements green
320+
315321
for (let i = c_left; i <= c_right; i++) highlight(vis, i, sortColor);
316322

323+
assignVarToA(vis, "left", c_left, size);
324+
assignVarToA(vis, "right", c_right, size);
325+
317326
}, [A, B, left, right, runlength]);
318327

319328
left = right + 1;
320329

321-
chunker.add('left2', (vis, a, c_left, c_rlength) => {
330+
chunker.add('left2', (vis, a, c_left, c_right, c_rlength) => {
322331
vis.array.set(a, 'msort_arr_bup'); //unhighlight array a
323-
set_simple_stack(vis.array, [c_rlength]);
332+
set_simple_stack(vis.array, [`runlength = ${c_rlength}`]);
324333

325334
if (c_left < size) assignVarToA(vis, 'left', c_left, size);
335+
assignVarToA(vis, "right", c_right, size);
326336

327-
if ((c_left + c_rlength) < size) {
328-
let left_2 = c_left;
329-
let mid_2 = (c_rlength + c_left - 1);
330-
let right_2 = (Math.min((mid_2 + c_rlength + 1), size) - 1);
331-
highlight2Runlength(vis, left_2, mid_2, right_2, runAColor, runBColor);
332-
}
333-
334-
335-
}, [A, left, runlength]);
337+
}, [A, left, right, runlength]);
336338

337339
}
338340

339341
runlength = 2 * runlength;
340342

341343
chunker.add('mergeDone', (vis, c_rlength) => {
344+
assignVarToA(vis, "right", undefined, size);
342345
highlightAllRunlengths(vis, c_rlength, runAColor, runBColor, size);
343346
}, [runlength])
344347

345348
chunker.add('runlength2', (vis, c_rlength) => {
346349

347350
assignVarToA(vis, 'left', undefined, size);
348-
set_simple_stack(vis.array, [c_rlength]);
351+
set_simple_stack(vis.array, [`runlength = ${c_rlength}`]);
349352

350353
if (c_rlength < size) {
351354
assignVarToA(vis, "runlength", c_rlength - 1, size);
@@ -359,7 +362,7 @@ export function run_msort() {
359362
for (let i = 0; i < size; i++) {
360363
highlight(vis, i, sortColor);
361364
}
362-
assignVarToA(vis, 'Done', size, size);
365+
363366
set_simple_stack(vis.array, ["DONE"]);
364367

365368
}, []);

src/algorithms/controllers/msort_arr_nat.js

Lines changed: 69 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import {
1414
displayMergeLabels,
1515
highlightAPointers,
1616
set_simple_stack,
17-
resetArrayA
17+
resetArrayA,
18+
highlightFromTo
1819
} from './msort_shared.js';
1920

2021
const run = run_msort();
@@ -66,6 +67,33 @@ export function initVisualisers() {
6667
// Define helper functions
6768
// -------------------------------------------------------------------------------
6869

70+
// This function highlights all the runs alternating colours, kudos to chatgpt
71+
function highlightNaturalRuns(vis, array, runAColor, runBColor) {
72+
let toggle = 0; // 0 = runAColor, 1 = runBColor
73+
let i = 0;
74+
75+
while (i < array.length) {
76+
let start = i;
77+
78+
// Find the length of the increasing run
79+
while (i < array.length - 1 && array[i] <= array[i + 1]) {
80+
i++;
81+
}
82+
83+
// Highlight the run
84+
for (let j = start; j <= i; j++) {
85+
highlight(vis, j, toggle == 0 ? runAColor : runBColor);
86+
}
87+
88+
// Flip toggle between 0 and 1 for the next run
89+
toggle = 1 - toggle;
90+
91+
// Move to the next element after the current run
92+
i++;
93+
}
94+
}
95+
96+
6997

7098

7199
/**
@@ -106,18 +134,21 @@ export function run_msort() {
106134

107135
do {
108136

109-
chunker.add('MainWhile', () => {
137+
chunker.add('MainWhile', (vis, a) => {
110138
// no animation
111-
}, []);
139+
highlightNaturalRuns(vis, a, runAColor, runBColor);
140+
}, [A]);
112141

113142

114143

115144
runcount = 0;
116145
let left = 0;
117146

118-
chunker.add('runcount', (vis, c_rcount) => {
119-
set_simple_stack(vis.array, [c_rcount]);
120-
}, [runcount]);
147+
chunker.add('runcount', (vis, a, c_rcount) => {
148+
vis.array.set(a, 'msort_arr_nat');
149+
set_simple_stack(vis.array, [`runcount = ${c_rcount}`]);
150+
151+
}, [A, runcount]);
121152

122153
chunker.add('left', (vis, c_left) => {
123154
assignVarToA(vis, 'left', c_left, size);
@@ -306,7 +337,7 @@ export function run_msort() {
306337
chunker.add('CopyRest2', (vis, a, b, c_ap2, c_max2, c_left, c_right, c_mid, c_rcount) => {
307338
// future color: should be runAColor & runBColor
308339
resetArrayA(vis, "nat", a, c_left, c_mid, c_right, c_rcount, runAColor, runCColor);
309-
if (isMergeExpanded()) vis.arrayB.set(b, 'msort_arr_nat');
340+
if (isMergeCopyExpanded()) vis.arrayB.set(b, 'msort_arr_nat');
310341
assignVarToA(vis, 'ap2', c_ap2, size);
311342
assignVarToA(vis, 'max2', c_max2, size);
312343
// highlight sorted elements green
@@ -320,33 +351,51 @@ export function run_msort() {
320351
}
321352
chunker.add('copyBA', (vis, a, b, c_left, c_right, c_rcount) => {
322353
vis.array.set(a, 'msort_arr_nat');
323-
if (isMergeExpanded()) vis.arrayB.set(b, 'msort_arr_nat');
354+
if (isMergeCopyExpanded()) vis.arrayB.set(b, 'msort_arr_nat');
324355
// highlight all sorted elements green
325356
for (let i = c_left; i <= c_right; i++) highlight(vis, i, sortColor);
326-
set_simple_stack(vis.array, [c_rcount]);
357+
set_simple_stack(vis.array, [`runcount = ${c_rcount}`]);
358+
359+
assignVarToA(vis, "left", c_left, size);
360+
assignVarToA(vis, "right", c_right, size);
361+
327362
}, [A, B, left, right, runcount]);
328363
}
329364

330365
runcount = runcount + 1;
331-
chunker.add('runcount+', (vis, c_rcount) => {
332-
set_simple_stack(vis.array, [c_rcount]);
333-
}, [runcount]);
366+
chunker.add('runcount+', (vis, c_left, c_mid, c_rcount) => {
367+
highlightFromTo(vis, c_left, c_mid, sortColor);
368+
set_simple_stack(vis.array, [`runcount = ${c_rcount}`]);
369+
}, [left, mid, runcount]);
334370

335371
left = right + 1;
336-
chunker.add('left2', (vis, a, c_left, c_rcount) => {
372+
chunker.add('left2', (vis, a, c_left, c_right, c_rcount) => {
337373
vis.array.set(a, 'msort_arr_nat'); // unhighlight array a
338-
set_simple_stack(vis.array, [c_rcount]);
339-
if (c_left < size) assignVarToA(vis, 'left', c_left);
340-
}, [A, left, runcount]);
374+
set_simple_stack(vis.array, [`runcount = ${c_rcount}`]);
375+
if (c_left < size) {
376+
assignVarToA(vis, 'left', c_left, size);
377+
assignVarToA(vis, "right", c_right, size);
378+
}
379+
380+
381+
}, [A, left, right, runcount]);
341382

342383
} while (left < size);
384+
385+
chunker.add('mergeDone', (vis, a) => {
386+
highlightNaturalRuns(vis, a, runAColor, runBColor);
387+
}, [A])
388+
343389
} while (runcount > 1);
344390

345-
chunker.add('Done', (vis) => {
346-
for (let i = 0; i < size; i++) highlight(vis, i, "sortColor");
347-
assignVarToA(vis, 'Done', size, size);
391+
chunker.add('Done', (vis, a) => {
392+
vis.array.set(a, 'msort_arr_nat');
393+
for (let i = 0; i < size; i++) {
394+
highlight(vis, i, sortColor);
395+
}
396+
348397
set_simple_stack(vis.array, ["DONE"]);
349-
}, []);
398+
}, [A]);
350399

351400
const maxValue = entire_num_array.reduce((acc, curr) => (acc < curr ? curr : acc), 0);
352401

src/algorithms/controllers/msort_shared.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ export function highlight(vis, index, color) {
2626
vis.array.patch(index);
2727
}
2828
}
29+
2930
// Same as highlight() but checks isMergeExpanded()/arrayB is displayed, otherwise does nothing
3031
export function highlightB(vis, index, color) {
31-
if (isMergeExpanded()) {
32+
if (isMergeCopyExpanded()) {
3233
if (color == 'red') {
3334
vis.arrayB.select(index);
3435
}
@@ -48,6 +49,14 @@ export function unhighlight(vis, index, color) {
4849
}
4950
}
5051

52+
// Highlights one runlength
53+
export function highlightFromTo(vis, from, to, color) {
54+
// highlight first runlength color A
55+
for (let i = from; i <= to; i++) {
56+
highlight(vis, i, color);
57+
}
58+
}
59+
5160
// Highlights two runlengths two colours
5261
export function highlight2Runlength(vis, left, mid, right, colorA, colorB) {
5362
// highlight first runlength color A
@@ -110,5 +119,8 @@ export function resetArrayA(vis, arr_type, A, left, mid, right, stack, colorA, c
110119
if (arr_type === "nat") vis.array.set(A, 'msort_arr_nat');
111120

112121
highlight2Runlength(vis, left, mid, right, colorA, colorB);
113-
set_simple_stack(vis.array, [stack]);
122+
123+
124+
if (arr_type === "bup") set_simple_stack(vis.array, [`runlength = ${stack}`]);
125+
if (arr_type === "nat") set_simple_stack(vis.array, [`runcount = ${stack}`]);
114126
}

src/algorithms/pseudocode/msort_arr_nat.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ MergeAll
4949
left <- right + 1 // skip to the next pair of runs (if any) \\B left2
5050
until left >= size
5151
\\In}
52+
// all consecutive pairs of runs merged \\B mergeDone
5253
\\Code}
5354
5455
\\Code{

src/components/DataStructures/Array/Array1DRenderer/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,14 @@ class Array1DRenderer extends Array2DRenderer {
228228
<caption
229229
className={styles.captionmsort_arr_bup}
230230
kth-tag="msort_arr_bup_caption"
231-
> runlength = &emsp; {listOfNumbers}&emsp;&emsp; </caption>)
231+
> &emsp; {listOfNumbers}&emsp;&emsp; </caption>)
232232
}
233233
{
234234
algo === 'msort_arr_nat' && listOfNumbers && (
235235
<caption
236236
className={styles.captionmsort_arr_nat}
237237
kth-tag="msort_arr_nat_caption"
238-
> runcount = &emsp; {listOfNumbers}&emsp;&emsp; </caption>)
238+
> &emsp; {listOfNumbers}&emsp;&emsp; </caption>)
239239
}
240240
</table>
241241
);

0 commit comments

Comments
 (0)