Skip to content

Commit 37d83ea

Browse files
committed
Heapsort now best in the world again:)
1 parent e3684d6 commit 37d83ea

File tree

1 file changed

+41
-17
lines changed

1 file changed

+41
-17
lines changed

src/algorithms/controllers/heapSort.js

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,26 +93,40 @@ export default {
9393
* parent = k , left child = 2*k, right child = 2*k + 1
9494
*/
9595

96+
let lastiHighlight = null;
97+
9698
// build heap
9799
// start from the last non-leaf node, work backwards to maintain the heap
98100
for (let k = Math.floor(n / 2) - 1; k >= 0; k -= 1) {
99-
chunker.add(4, (vis, index) => {
100-
vis.array.assignVariable('k', index);
101-
}, [k]);
101+
// chunker.add(4, (vis, index) => {
102+
// vis.array.assignVariable('k', index);
103+
// }, [k]);
102104

103105
let j;
104106
const tmp = i;
105107
i = k;
106108

107-
chunker.add(6, (vis, index1, index2) => {
108-
if (tmp != null) {
109+
chunker.add(4, (vis, index1, index2) => {
110+
vis.array.assignVariable('k', index1);
111+
// if (tmp != null) { // XXX looks dodgy using tmp here?
112+
if (index2 != null) {
109113
unhighlight(vis, index2);
110114
vis.array.removeVariable('j');
111115
}
112116
highlight(vis, index1);
117+
}, [i, tmp]);
118+
119+
chunker.add(6, (vis, index1, index2) => {
120+
// if (tmp != null) { // XXX looks dodgy using tmp here?
121+
// if (index2 != null) {
122+
// unhighlight(vis, index2);
123+
// vis.array.removeVariable('j');
124+
// }
125+
// highlight(vis, index1);
113126
vis.array.assignVariable('i', index1);
114127
}, [i, tmp]);
115128

129+
lastiHighlight = k;
116130
heap = false;
117131
chunker.add(7);
118132

@@ -141,37 +155,44 @@ export default {
141155
// parent is greater than largest child, so it is already a valid heap
142156
if (A[i] >= A[j]) {
143157
heap = true;
144-
chunker.add(15, (vis, index) => {
158+
chunker.add(15, (vis, index, lastH) => {
145159
unhighlight(vis, index, false);
146160
// possible last chunk in BuildHeap/DownHeapk
147161
// remove i, j if !isDownHeapkExpanded
148162
if (!isDownHeapkExpanded()) {
149163
vis.array.assignVariable('i', undefined);
150164
vis.array.assignVariable('j', undefined);
151165
}
152-
// remove k if !isBuildHeapExpanded
166+
// remove k+highlighting if !isBuildHeapExpanded
153167
if (!isBuildHeapExpanded()) {
154168
vis.array.assignVariable('k', undefined);
169+
if (lastiHighlight !== null) {
170+
unhighlight(vis, lastH);
171+
}
155172
}
156-
}, [j]);
173+
}, [j, lastiHighlight]);
157174
} else {
158175
swap = A[i];
159176
A[i] = A[j];
160177
A[j] = swap;
161178
swapAction(17, i, j);
162-
chunker.add(18, (vis, p, c) => {
179+
lastiHighlight = j;
180+
chunker.add(18, (vis, p, c, lastH) => {
163181
unhighlight(vis, p, false);
164182
vis.array.assignVariable('i', c);
165183
// remove i, j if !isDownHeapkExpanded
166184
if (!isDownHeapkExpanded()) {
167185
vis.array.assignVariable('i', undefined);
168186
vis.array.assignVariable('j', undefined);
169187
}
170-
// remove k if !isDownHeapkExpanded
188+
// remove k+highlighting if !isDownHeapkExpanded
171189
if (!isBuildHeapExpanded()) {
172190
vis.array.assignVariable('k', undefined);
191+
if (lastiHighlight !== null) {
192+
unhighlight(vis, lastH);
193+
}
173194
}
174-
}, [i, j]);
195+
}, [i, j, lastiHighlight]);
175196
i = j;
176197
}
177198
}
@@ -185,7 +206,10 @@ export default {
185206
if (nVal === nodes.length) {
186207
vis.array.clearVariables();
187208
vis.array.assignVariable('n', nVal - 1);
188-
} else vis.array.removeVariable('j');
209+
} else {
210+
vis.array.removeVariable('i');
211+
vis.array.removeVariable('j');
212+
}
189213

190214
// else only clear 'j'
191215

@@ -198,14 +222,14 @@ export default {
198222
A[0] = swap;
199223

200224
chunker.add(21, (vis, index) => {
201-
highlight(vis, 0);
202-
highlight(vis, index, false);
225+
highlight(vis, index);
226+
highlight(vis, 0, false);
203227
}, [n - 1]);
204228
swapAction(21, 0, n - 1);
205229

206230
chunker.add(22, (vis, index) => {
207-
unhighlight(vis, index);
208-
unhighlight(vis, 0, false);
231+
// unhighlight(vis, index);
232+
unhighlight(vis, index, false);
209233
vis.array.sorted(index);
210234
vis.heap.sorted(index + 1);
211235

@@ -216,7 +240,7 @@ export default {
216240
i = 0;
217241
chunker.add(24, (vis, index1, nVal) => {
218242
if (nVal > 0) {
219-
highlight(vis, index1);
243+
// highlight(vis, index1);
220244
}
221245
vis.array.assignVariable('i', index1);
222246
}, [i, n]);

0 commit comments

Comments
 (0)