Number Sorter
The Project
Interactive Number Sorter developed with JavaScript, focusing on the implementation and understanding of basic sorting algorithms: Bubble Sort, Selection Sort, and Insertion Sort. A project that unveils the logic behind sorting algorithms.
Source Code
- index.html
- styles.css
- script.js
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="./styles.css" />
<title>Number Sorter</title>
</head>
<body>
<main>
<h1>Number Sorter</h1>
<form id="form" class="form">
<h2>Input:</h2>
<fieldset>
<span class="bracket">[</span>
<div>
<select
name="values"
class="values-dropdown"
aria-label="first number"
>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8" selected>8</option>
<option value="9">9</option>
</select>
<span class="comma">,</span>
</div>
<div>
<select
name="values"
class="values-dropdown"
aria-label="second number"
>
<option value="0">0</option>
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
<span class="comma">,</span>
</div>
<div>
<select
name="values"
class="values-dropdown"
aria-label="third number"
>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4" selected>4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
<span class="comma">,</span>
</div>
<div>
<select
name="values"
class="values-dropdown"
aria-label="fourth number"
>
<option value="0">0</option>
<option value="1" selected>1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
<span class="comma">,</span>
</div>
<div>
<select
name="values"
class="values-dropdown"
aria-label="fifth number"
>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected>3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
</div>
<span class="bracket">]</span>
</fieldset>
<button id="sort">Sort</button>
</form>
<div class="output-container">
<h2>Output:</h2>
<div class="output-array">
<span class="bracket">[</span>
<div>
<span class="output-value" id="output-value-0">0</span>
<span class="comma">,</span>
</div>
<div>
<span class="output-value" id="output-value-1">0</span>
<span class="comma">,</span>
</div>
<div>
<span class="output-value" id="output-value-2">0</span>
<span class="comma">,</span>
</div>
<div>
<span class="output-value" id="output-value-3">0</span>
<span class="comma">,</span>
</div>
<div>
<span class="output-value" id="output-value-4">0</span>
</div>
<span class="bracket">]</span>
</div>
</div>
</main>
<script src="./script.js"></script>
</body>
</html>
:root {
--gray-00: #ffffff;
--gray-05: #f5f6f7;
--gray-15: #d0d0d5;
--gray-75: #3b3b4f;
--gray-85: #1b1b32;
--gray-90: #0a0a23;
--blue-50: #198eee;
--error: #a94442;
--danger-color: #850000;
--danger-background: #ffadad;
}
*,
::before,
::after {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
font-family: "Lato", Helvetica, Arial, sans-serif;
font-size: 18px;
background-color: var(--gray-85);
color: var(--gray-05);
}
main {
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
margin: 30px auto;
}
h2 {
margin-bottom: 15px;
}
form {
width: 100%;
text-align: center;
padding: 15px;
}
fieldset {
border: 0 none;
height: 100%;
margin: auto;
display: flex;
justify-content: space-around;
align-items: center;
}
fieldset div {
display: flex;
justify-content: center;
align-items: center;
}
.bracket,
.comma {
font-size: 2.3em;
}
form .comma {
margin-left: 2px;
}
select {
font-family: inherit;
font-size: inherit;
line-height: inherit;
height: 38px;
width: 50px;
text-align: center;
}
button {
cursor: pointer;
margin-top: 15px;
text-decoration: none;
background-image: linear-gradient(#fecc4c, #ffac33);
border: 3px solid #feac32;
padding: 10px 16px;
font-size: 23px;
width: 100%;
}
select:focus-visible,
button:focus-visible {
outline: 3px solid var(--blue-50);
}
.output-container {
width: 95%;
min-height: 55px;
margin-top: 25px;
border-radius: 0;
padding: 15px;
overflow-wrap: break-word;
text-align: center;
}
.output-array {
width: 100%;
margin: auto;
display: flex;
align-items: center;
justify-content: space-around;
}
.output-value {
font-size: 2em;
}
.alert {
background-color: var(--danger-background);
border: 3px solid var(--danger-color);
color: var(--danger-color);
}
@media (min-width: 550px) {
form,
.output-container {
max-width: 480px;
}
fieldset {
max-width: 400px;
}
.output-array {
max-width: 420px;
}
}
const sortButton = document.getElementById("sort");
const sortInputArray = (event) => {
event.preventDefault();
const inputValues = [
...document.getElementsByClassName("values-dropdown")
].map((dropdown) => Number(dropdown.value));
const sortedValues = inputValues.sort((a, b) => {
return a - b;
});
updateUI(sortedValues);
}
const updateUI = (array = []) => {
array.forEach((num, i) => {
const outputValueNode = document.getElementById(`output-value-${i}`);
outputValueNode.innerText = num;
})
}
const bubbleSort = (array) => {
for (let i = 0; i < array.length; i++) {
for (let j = 0; j < array.length - 1; j++) {
if (array[j] > array[j + 1]) {
const temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
}
const selectionSort = (array) => {
for (let i = 0; i < array.length; i++) {
let minIndex = i;
for (let j = i + 1; j < array.length; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
const temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
return array;
}
const insertionSort = (array) => {
for (let i = 1; i < array.length; i++) {
const currValue = array[i];
let j = i - 1;
while (j >= 0 && array[j] > currValue) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = currValue;
}
return array;
}
sortButton.addEventListener("click", sortInputArray);
The Learning Behind the Triviality
In projects like this, I realize how much we take everything for granted.
What seems like a very simple program that sorts 5 numbers, from smallest to largest, is seen by any outsider through the glasses of the Dunning-Kruger Effect.
It wasn't easy, but it clearly strengthened my understanding of for loops, especially nested ones.
What I Learned
Basic Algorithmic Thinking:
- Bubble Sort: Implementation of a nested
forloop to compare and swap adjacent elements, causing the largest value to "bubble up" to the end of the array with each iteration. - Selection Sort: Use of a nested
forloop to find the index of the minimum value in the unsorted portion of the array and swap it with the first element, progressively building the sorted portion from left to right. - Insertion Sort: Creation of a virtual sorted array at the beginning, iterating through the array and inserting each element into its correct position within the already sorted portion.
Nested for Loops:
- Deep understanding of how inner and outer loops interact to iterate and manipulate data in an array.
- Use of temporary variables (
temp) for swapping values during sorting.
DOM Manipulation:
- Selection of a collection of elements with
getElementsByClassName. - Use of the spread operator (
...) to convert anHTMLCollectioninto an array, making it iterable with methods like.map(). - Extraction of values from
<select>elements with.map((dropdown) => Number(dropdown.value)). - Dynamic UI update with
forEachto display the sorted array.
Functions and Events:
- Callback function for the
.sort()method to define an ascending numerical sort ((a, b) => a - b). - Handling of the
clickevent to start the sorting process. - Use of
event.preventDefault()to prevent the default form behavior.
Next Project: Learn Advanced Array Methods by Building a Statistics Calculator