The screenshot above is my current preview, I believe I got all the red dotted lines added correctly, and I think it works exactly like the example.
Current Javascript:
function generateElement() {
return Math.floor(Math.random() * 100) + 1;
}
function generateArray() {
const array = [];
for (let i = 0; i < 5; i++) {
array.push(generateElement());
}
return array;
}
function generateContainer() {
return document.createElement('div');
}
function fillArrContainer(container, arr) {
container.innerHTML = '';
arr.forEach(num => {
const span = document.createElement('span');
span.textContent = num;
container.appendChild(span);
});
}
function isOrdered(a, b) {
return a <= b;
}
function swapElements(arr, index) {
if (index < arr.length - 1 && arr[index] > arr[index + 1]) {
[arr[index], arr[index + 1]] = [arr[index + 1], arr[index]];
}
}
function highlightCurrentEls(container, index) {
const spans = container.getElementsByTagName('span');
Array.from(spans).forEach((span, i) => {
if (i === index || i === index + 1) {
span.style.border = '2px dashed red';
} else {
span.style.border = '';
}
});
}
document.addEventListener('DOMContentLoaded', () => {
const generateBtn = document.getElementById('generate-btn');
const sortBtn = document.getElementById('sort-btn');
const startingContainer = document.getElementById('starting-array');
const arrayContainer = document.getElementById('array-container');
let startingArray = [];
generateBtn.addEventListener('click', () => {
arrayContainer.innerHTML = '';
startingArray = generateArray();
startingContainer.innerHTML = '';
fillArrContainer(startingContainer, startingArray);
highlightCurrentEls(startingContainer, 0);
highlightCurrentEls(startingContainer, 1);
});
sortBtn.addEventListener('click', () => {
if (startingArray.length === 0) {
alert("Please generate an array first.");
return;
}
arrayContainer.innerHTML = '';
let sortedArray = [...startingArray];
let steps = [sortedArray.slice()];
highlightCurrentEls(startingContainer, 0);
highlightCurrentEls(startingContainer, 1);
for (let i = 0; i < sortedArray.length; i++) {
for (let j = 0; j < sortedArray.length - 1; j++) {
highlightCurrentEls(startingContainer, j);
highlightCurrentEls(startingContainer, j + 1);
swapElements(sortedArray, j);
steps.push(sortedArray.slice());
}
}
const startingArrayContainer = generateContainer();
fillArrContainer(startingArrayContainer, startingArray);
highlightCurrentEls(startingArrayContainer, 0);
highlightCurrentEls(startingArrayContainer, 1);
arrayContainer.appendChild(startingArrayContainer);
steps.forEach((step, index) => {
const stepContainer = generateContainer();
fillArrContainer(stepContainer, step);
highlightCurrentEls(stepContainer, index % (step.length - 1));
highlightCurrentEls(stepContainer, (index % (step.length - 1)) + 1);
arrayContainer.appendChild(stepContainer);
});
const sortedArrayContainer = generateContainer();
fillArrContainer(sortedArrayContainer, sortedArray);
highlightCurrentEls(sortedArrayContainer, 0);
highlightCurrentEls(sortedArrayContainer, 1);
arrayContainer.appendChild(sortedArrayContainer);
});
});
My HTML and CSS are the same as before, I just changed my CSS.