Skip to content
Snippets Groups Projects

implemented MergeSort

Merged Daniel Runte requested to merge feature/MergeSort into main
5 files
+ 187
15
Compare changes
  • Side-by-side
  • Inline
Files
5
src/MergeSort.js 0 → 100644
+ 122
0
async function MergeSort(EingangsArray, startIdx, endIdx, arrayCopy, updateBars, setColor, sortSpeed) {
if (startIdx >= endIdx) return;
// Split array
const cuttingEdge = Math.floor((startIdx + endIdx) / 2);
// Recursively sort both halves
await MergeSort(EingangsArray, startIdx, cuttingEdge, arrayCopy, updateBars, setColor, sortSpeed);
await MergeSort(EingangsArray, cuttingEdge + 1, endIdx, arrayCopy, updateBars, setColor, sortSpeed);
// Merge halves back togeteher
await merge(EingangsArray, startIdx, cuttingEdge, endIdx, arrayCopy, updateBars, setColor, sortSpeed);
}
async function merge(EingangsArray, startIdx, middleIdx, endIdx, arrayCopy, updateBars, setColor, sortSpeed) {
let i = startIdx;
let j = middleIdx + 1;
let k = startIdx;
const bars = document.querySelectorAll('.bar'); // get all bars
const sortSpeedSwitch = Number(sortSpeed);
// index exist?
const isValidIndex = (index) => index >= 0 && index < bars.length;
// Merge halves back togeteher
while (i <= middleIdx && j <= endIdx) {
if (isValidIndex(i) && isValidIndex(j)) {
// Change color of compared bars
bars[i].style.backgroundColor = 'red';
bars[j].style.backgroundColor = 'red';
}
switch (sortSpeedSwitch) {
case 0:
break; // No delay
case 40:
await new Promise(resolve => setTimeout(resolve, 90));
break;
case 100:
await new Promise(resolve => setTimeout(resolve, 200));
break;
}
if (EingangsArray[i] <= EingangsArray[j]) {
arrayCopy[k] = EingangsArray[i];
i++;
} else {
arrayCopy[k] = EingangsArray[j];
j++;
}
// Update Array
await updateArrayState(EingangsArray, arrayCopy, startIdx, endIdx, updateBars, sortSpeed);
if (isValidIndex(i - 1)) bars[i - 1].style.backgroundColor = ''; // default colr
if (isValidIndex(j - 1)) bars[j - 1].style.backgroundColor = '';
k++;
}
// Copy from the LEFT half
while (i <= middleIdx) {
switch (sortSpeedSwitch) {
case 0:
break; // No delay
case 40:
await new Promise(resolve => setTimeout(resolve, 90));
break;
case 100:
await new Promise(resolve => setTimeout(resolve, 200));
break;
}
arrayCopy[k] = EingangsArray[i];
await updateArrayState(EingangsArray, arrayCopy, startIdx, endIdx, updateBars, sortSpeed);
if (isValidIndex(i)) bars[i].style.backgroundColor = '';
i++;
k++;
}
// Copy from the RIGHT half
while (j <= endIdx) {
switch (sortSpeedSwitch) {
case 0:
break; // No delay
case 40:
await new Promise(resolve => setTimeout(resolve, 90));
break;
case 100:
await new Promise(resolve => setTimeout(resolve, 200));
break;
}
arrayCopy[k] = EingangsArray[j];
await updateArrayState(EingangsArray, arrayCopy, startIdx, endIdx, updateBars, sortSpeed);
if (isValidIndex(j)) bars[j].style.backgroundColor = '';
j++;
k++;
}
// Copy merged values back
for (let i = startIdx; i <= endIdx; i++) {
EingangsArray[i] = arrayCopy[i];
}
// adding to class 'finished'
if (endIdx - startIdx + 1 === EingangsArray.length) {
setColor(0);
}
}
async function updateArrayState(EingangsArray, arrayCopy, startIdx, endIdx, updateBars, sortSpeed) {
updateBars([...arrayCopy]);
await new Promise(resolve => setTimeout(resolve, sortSpeed));
}
export default async function startMergeSort(EingangsArray, updateBars, setFinish, sortSpeed) {
const arrayCopy = [...EingangsArray];
await MergeSort(EingangsArray, 0, EingangsArray.length - 1, arrayCopy, updateBars, setFinish, sortSpeed);
}
Loading