@@ -96,6 +96,58 @@ function highlight2Runlength(vis, left, mid, right, colorA, colorB) {
96
96
for ( let j = mid + 1 ; j <= right ; j ++ ) highlight ( vis , j , colorB ) ;
97
97
}
98
98
99
+ // Highlight entire array alternating colors for runlength
100
+ function highlightAllRunlengths ( vis , runlength , colorA , colorB , size ) {
101
+ let toggle = 0 ; // 0 = colorA, 1 = colorB
102
+
103
+ for ( let i = 0 ; i < size ; i ++ ) {
104
+ if ( toggle == 0 ) {
105
+ highlight ( vis , i , colorA ) ;
106
+ console . log ( "toggle == 0" ) ;
107
+ }
108
+ if ( toggle == 1 ) {
109
+ highlight ( vis , i , colorB ) ;
110
+ console . log ( "toggle == 1" ) ;
111
+ }
112
+ console . log ( "(i + 1) % runlength = " + ( runlength % ( i + 1 ) ) ) ;
113
+ console . log ( "(runlength = " + ( runlength ) ) ;
114
+ // Switch color after completing a run of length 'runlength'
115
+ if ( ( i + 1 ) % runlength == 0 ) {
116
+
117
+ console . log ( "(i + 1) % runlength == 0" ) ;
118
+
119
+ toggle = 1 - toggle ; // Flip toggle between 0 and 1
120
+
121
+ } console . log ( "toggle = " + toggle ) ;
122
+ }
123
+ }
124
+
125
+ // Unhighlight entire array alternating colors for runlength
126
+ function unhighlightAllRunlengths ( vis , runlength , colorA , colorB , size ) {
127
+ let toggle = 0 ; // 0 = colorA, 1 = colorB
128
+
129
+ for ( let i = 0 ; i < size ; i ++ ) {
130
+ if ( toggle == 0 ) {
131
+ unhighlight ( vis , i , colorA ) ;
132
+ console . log ( "toggle == 0" ) ;
133
+ }
134
+ if ( toggle == 1 ) {
135
+ unhighlight ( vis , i , colorB ) ;
136
+ console . log ( "toggle == 1" ) ;
137
+ }
138
+ console . log ( "(i + 1) % runlength = " + ( runlength % ( i + 1 ) ) ) ;
139
+ console . log ( "(runlength = " + ( runlength ) ) ;
140
+ // Switch color after completing a run of length 'runlength'
141
+ if ( ( i + 1 ) % runlength == 0 ) {
142
+
143
+ console . log ( "(i + 1) % runlength == 0" ) ;
144
+
145
+ toggle = 1 - toggle ; // Flip toggle between 0 and 1
146
+
147
+ } console . log ( "toggle = " + toggle ) ;
148
+ }
149
+ }
150
+
99
151
// unhighlights arrayA
100
152
function unhighlight ( vis , index , color ) {
101
153
if ( color == 'red' ) {
@@ -106,6 +158,22 @@ function unhighlight(vis, index, color) {
106
158
}
107
159
}
108
160
161
+ function highlightAPointers ( vis , ap1 , max1 , ap2 , max2 , color ) {
162
+ if ( ap1 <= max1 ) {
163
+ highlight ( vis , ap1 , color ) ;
164
+ }
165
+ if ( ap2 <= max2 ) {
166
+ highlight ( vis , ap2 , color ) ;
167
+ }
168
+ }
169
+
170
+ // this function sets array a, highlighting from left to mid red, and set the stack
171
+ function resetArrayA ( vis , A , left , mid , right , runlength ) {
172
+ vis . array . set ( A , 'msort_arr_bup' ) ;
173
+ highlight2Runlength ( vis , left , mid , right , colorA , colorA ) ;
174
+ set_simple_stack ( vis . array , [ runlength ] ) ;
175
+ }
176
+
109
177
// Assigns label to array A at index, checks if index is greater than size of array
110
178
// if index is greater than size, assign label to last element in array
111
179
function assignVarToA ( vis , variable_name , index , size ) {
@@ -146,6 +214,8 @@ function displayMergeLabels(vis, ap1, max1, ap2, max2, bp, size) {
146
214
if ( isMergeExpanded ( ) ) assignVarToB ( vis , 'bp' , bp , size ) ;
147
215
}
148
216
217
+
218
+
149
219
function set_simple_stack ( vis_array , c_stk ) {
150
220
console . log ( "set_simple_stack" + c_stk ) ;
151
221
console . log ( c_stk ) ;
@@ -190,27 +260,34 @@ export function run_msort() {
190
260
191
261
chunker . add ( 'runlength' , ( vis , c_rlength ) => {
192
262
displayRunlength ( vis , c_rlength , size ) ;
263
+
193
264
set_simple_stack ( vis . array , [ c_rlength ] ) ;
265
+ highlightAllRunlengths ( vis , c_rlength , colorA , colorB , size ) ;
194
266
} , [ runlength , simple_stack ] ) ;
195
267
196
268
while ( runlength < size ) {
197
269
let left = 0 ;
198
270
199
271
chunker . add ( 'MainWhile' , ( vis , c_rlength , c_left ) => {
272
+
200
273
// display size label
201
274
assignVarToA ( vis , ( "size = " + size ) , size , size ) ;
202
275
203
- let left_2 = c_left ;
204
- let mid_2 = ( c_rlength + c_left - 1 ) ;
205
- let right_2 = ( Math . min ( c_rlength * 2 , size ) - 1 ) ;
206
276
207
- highlight2Runlength ( vis , left_2 , mid_2 , right_2 , colorA , colorB ) ;
208
277
209
278
} , [ runlength , left ] ) ;
210
279
211
- chunker . add ( 'left' , ( vis , c_left ) => {
280
+ chunker . add ( 'left' , ( vis , c_left , c_rlength ) => {
212
281
assignVarToA ( vis , 'left' , c_left , size ) ;
213
- } , [ left ] ) ;
282
+
283
+ unhighlightAllRunlengths ( vis , c_rlength , colorA , colorB , size ) ;
284
+
285
+ let left_2 = c_left ;
286
+ let mid_2 = ( c_rlength + c_left - 1 ) ;
287
+ let right_2 = ( Math . min ( c_rlength * 2 , size ) - 1 ) ;
288
+
289
+ highlight2Runlength ( vis , left_2 , mid_2 , right_2 , colorA , colorB ) ;
290
+ } , [ left , runlength ] ) ;
214
291
215
292
while ( ( left + runlength ) <= size ) {
216
293
@@ -236,14 +313,23 @@ export function run_msort() {
236
313
237
314
chunker . add ( 'right' , ( vis , c_right ) => {
238
315
assignVarToA ( vis , 'right' , c_right , size ) ;
316
+
239
317
} , [ right ] ) ;
240
318
241
- chunker . add ( 'ap1' , ( vis , c_ap1 ) => {
319
+ chunker . add ( 'ap1' , ( vis , a , c_ap1 , c_left , c_mid , c_right , c_rlength ) => {
242
320
if ( isMergeExpanded ( ) ) {
321
+
322
+ // now in the nitty gritty of Merge
323
+ // highlight the two parts you want to merge red
324
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
325
+
243
326
assignVarToA ( vis , 'left' , undefined , size ) ; // ap1 replaces left
244
327
assignVarToA ( vis , 'ap1' , c_ap1 , size ) ;
328
+ assignVarToA ( vis , 'mid' , c_mid , size ) ;
329
+ assignVarToA ( vis , 'right' , c_right , size ) ;
330
+
245
331
}
246
- } , [ ap1 ] ) ;
332
+ } , [ A , ap1 , left , mid , right , runlength ] ) ;
247
333
248
334
chunker . add ( 'max1' , ( vis , c_max1 ) => {
249
335
if ( isMergeExpanded ( ) ) {
@@ -258,10 +344,11 @@ export function run_msort() {
258
344
}
259
345
} , [ ap2 ] ) ;
260
346
261
- chunker . add ( 'max2' , ( vis , c_max2 ) => {
347
+ chunker . add ( 'max2' , ( vis , c_max2 , c ) => {
262
348
if ( isMergeExpanded ( ) ) {
263
349
assignVarToA ( vis , 'right' , undefined , size ) ; // max2 replaces right
264
350
assignVarToA ( vis , 'max2' , c_max2 , size ) ;
351
+
265
352
}
266
353
} , [ max2 ] ) ;
267
354
@@ -277,16 +364,19 @@ export function run_msort() {
277
364
if ( ! ( ap1 <= max1 && ap2 <= max2 ) ) break ;
278
365
279
366
chunker . add ( 'MergeWhile' , ( vis , a , c_left , c_right , c_mid , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , c_rlength ) => {
280
- vis . array . set ( a , 'msort_arr_bup' ) ;
367
+
368
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
369
+
281
370
displayMergeLabels ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , size ) ;
371
+
282
372
// future color: should be colorA & colorB
283
- highlight2Runlength ( vis , c_left , c_mid , c_right , colorA , colorA ) ;
284
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
373
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
374
+
285
375
} , [ A , left , right , mid , ap1 , max1 , ap2 , max2 , bp , runlength ] ) ;
286
376
287
- chunker . add ( 'findSmaller' , ( ) => {
377
+ chunker . add ( 'findSmaller' , ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 ) => {
288
378
// no animation
289
- } , [ ] ) ;
379
+ } , [ ap1 , max1 , ap2 , max2 ] ) ;
290
380
291
381
if ( A [ ap1 ] < A [ ap2 ] ) {
292
382
@@ -296,20 +386,28 @@ export function run_msort() {
296
386
chunker . add ( 'copyap1' , ( vis , a , b , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , c_left , c_right , c_mid , c_rlength ) => {
297
387
298
388
if ( isMergeExpanded ( ) ) vis . arrayB . set ( b , 'msort_arr_bup' ) ;
299
- vis . array . set ( a , 'msort_arr_bup' ) ;
389
+
390
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
391
+
300
392
301
393
displayMergeLabels ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , size ) ;
302
394
// future color: should be colorA & colorB
303
- highlight2Runlength ( vis , c_left , c_mid , c_right , colorA , colorA ) ;
395
+
396
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
304
397
// highlight sorted elements green (colorC)
305
398
for ( let i = c_left ; i <= c_bp ; i ++ ) highlightB ( vis , i , colorC ) ;
306
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
399
+
307
400
} , [ A , B , ap1 , max1 , ap2 , max2 , bp , left , right , mid , runlength ] ) ;
308
401
309
402
ap1 = ap1 + 1 ;
310
- chunker . add ( 'ap1++' , ( vis , c_ap1 ) => {
403
+ chunker . add ( 'ap1++' , ( vis , a , c_left , c_mid , c_right , c_rlength ,
404
+ c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp ) => {
405
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
406
+ displayMergeLabels ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , size ) ;
407
+
311
408
assignVarToA ( vis , 'ap1' , c_ap1 , size ) ;
312
- } , [ ap1 ] ) ;
409
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
410
+ } , [ A , left , mid , right , runlength , ap1 , max1 , ap2 , max2 , bp ] ) ;
313
411
314
412
bp = bp + 1 ;
315
413
chunker . add ( 'bp++' , ( vis , c_bp ) => {
@@ -318,29 +416,40 @@ export function run_msort() {
318
416
}
319
417
320
418
else {
321
- chunker . add ( 'findSmallerB' , ( ) => {
419
+ chunker . add ( 'findSmallerB' , ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 ) => {
322
420
// no animation
323
- } , [ ] ) ;
421
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
422
+
423
+ } , [ ap1 , max1 , ap2 , max2 ] ) ;
324
424
325
425
B [ bp ] = A [ ap2 ] ;
326
426
A [ ap2 ] = undefined ;
327
427
328
428
chunker . add ( 'copyap2' , ( vis , a , b , c_ap1 , c_ap2 , c_bp , c_max1 , c_max2 , c_left , c_right , c_mid , c_rlength ) => {
329
429
if ( isMergeExpanded ( ) ) vis . arrayB . set ( b , 'msort_arr_bup' ) ;
330
- vis . array . set ( a , 'msort_arr_bup' ) ;
430
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
431
+
331
432
displayMergeLabels ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , size ) ;
332
433
333
434
// future color: should be colorA & colorB
334
- highlight2Runlength ( vis , c_left , c_mid , c_right , colorA , colorA ) ;
435
+
436
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
437
+
335
438
// highlight sorted elements green / colorB
336
439
for ( let i = c_left ; i <= c_bp ; i ++ ) highlightB ( vis , i , 'green' )
337
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
440
+
338
441
} , [ A , B , ap1 , ap2 , bp , max1 , max2 , left , right , mid , runlength ] ) ;
339
442
340
443
ap2 = ap2 + 1 ;
341
- chunker . add ( 'ap2++' , ( vis , c_ap2 ) => {
444
+ chunker . add ( 'ap2++' , ( vis , a , c_left , c_mid , c_right , c_rlength ,
445
+ c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp ) => {
446
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
447
+ displayMergeLabels ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , c_bp , size ) ;
448
+
342
449
assignVarToA ( vis , "ap2" , c_ap2 , size ) ;
343
- } , [ ap2 ] ) ;
450
+ highlightAPointers ( vis , c_ap1 , c_max1 , c_ap2 , c_max2 , colorB ) ;
451
+
452
+ } , [ A , left , mid , right , runlength , ap1 , max1 , ap2 , max2 , bp ] ) ;
344
453
345
454
bp = bp + 1 ;
346
455
chunker . add ( 'bp++_2' , ( vis , c_bp ) => {
@@ -357,7 +466,8 @@ export function run_msort() {
357
466
358
467
chunker . add ( 'CopyRest1' , ( vis , a , b , c_ap1 , c_max1 , c_left , c_right , c_mid , c_bp , c_rlength ) => {
359
468
360
- vis . array . set ( a , 'msort_arr_bup' ) ;
469
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
470
+
361
471
if ( isMergeExpanded ( ) ) vis . arrayB . set ( b , 'msort_arr_bup' ) ;
362
472
363
473
// copying A[ap1..max1]
@@ -368,9 +478,7 @@ export function run_msort() {
368
478
// to highlight the solrted elements of B array green / colorC
369
479
for ( let i = c_left ; i < c_bp ; i ++ ) highlightB ( vis , i , colorC ) ;
370
480
371
- // future color: should be colorA & colorB
372
- highlight2Runlength ( vis , c_left , c_mid , c_right , colorA , colorA ) ;
373
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
481
+
374
482
} , [ A , B , ap1 , max1 , left , right , mid , bp , runlength ] ) ;
375
483
376
484
for ( let i = ap2 ; i <= max2 ; i ++ ) {
@@ -380,7 +488,8 @@ export function run_msort() {
380
488
}
381
489
382
490
chunker . add ( 'CopyRest2' , ( vis , a , b , c_ap2 , c_max2 , c_left , c_right , c_mid , c_rlength ) => {
383
- vis . array . set ( a , 'msort_arr_bup' ) ;
491
+ resetArrayA ( vis , a , c_left , c_mid , c_right , c_rlength ) ;
492
+
384
493
if ( isMergeExpanded ( ) ) vis . arrayB . set ( b , 'msort_arr_bup' ) ;
385
494
assignVarToA ( vis , 'ap2' , c_ap2 , size ) ;
386
495
assignVarToA ( vis , 'max2' , c_max2 , size ) ;
@@ -389,8 +498,7 @@ export function run_msort() {
389
498
for ( let i = c_left ; i <= c_right ; i ++ ) highlightB ( vis , i , colorC ) ;
390
499
391
500
// future color: should be colorA & colorB
392
- highlight2Runlength ( vis , c_left , c_mid , c_right , colorA , colorA ) ;
393
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
501
+
394
502
} , [ A , B , ap2 , max2 , left , right , mid , runlength ] ) ;
395
503
396
504
// copy merged elements from B to A
@@ -400,19 +508,22 @@ export function run_msort() {
400
508
}
401
509
402
510
chunker . add ( 'copyBA' , ( vis , a , b , c_left , c_right , c_rlength ) => {
511
+
403
512
vis . array . set ( a , 'msort_arr_bup' ) ;
513
+ set_simple_stack ( vis . array , [ c_rlength ] ) ;
514
+
404
515
if ( isMergeExpanded ( ) ) vis . arrayB . set ( b , 'msort_arr_bup' ) ;
405
516
406
517
// highlight all sorted elements green
407
518
for ( let i = c_left ; i <= c_right ; i ++ ) highlight ( vis , i , colorC ) ;
408
- set_simple_stack ( vis . array , [ c_rlength ] ) ;
519
+
409
520
} , [ A , B , left , right , runlength ] ) ;
410
521
411
522
let left2 = left ; // this is the old left before it was updated
412
523
413
524
left = right + 1 ;
414
525
415
- chunker . add ( 'left2' , ( vis , old_left , c_left , c_right ) => {
526
+ chunker . add ( 'left2' , ( vis , old_left , c_left , c_right , c_rlength ) => {
416
527
// unhighlight all elements in A
417
528
for ( let i = old_left ; i <= c_right ; i ++ ) {
418
529
unhighlight ( vis , i , colorC ) ;
@@ -421,13 +532,19 @@ export function run_msort() {
421
532
assignVarToA ( vis , 'left' , c_left , size ) ;
422
533
}
423
534
424
- } , [ left2 , left , right ] ) ;
535
+ } , [ left2 , left , right , runlength ] ) ;
425
536
426
537
}
538
+ runlength = 2 * runlength ;
539
+
540
+ chunker . add ( 'mergeDone' , ( vis , c_rlength ) => {
541
+ highlightAllRunlengths ( vis , c_rlength , colorA , colorB , size ) ;
542
+ } , [ runlength ] )
427
543
428
544
429
- runlength = 2 * runlength ;
430
545
chunker . add ( 'runlength2' , ( vis , c_rlength ) => {
546
+
547
+ // highlightAllRunlengths(vis, c_rlength, colorA, colorB, size);
431
548
assignVarToA ( vis , 'left' , undefined , size ) ;
432
549
set_simple_stack ( vis . array , [ c_rlength ] ) ;
433
550
0 commit comments