Insertion Sort
See it animated in Zerethon Tools ↗Insert each element into the sorted part on its left — O(n²), fast on nearly sorted data.
Implementations
Sign in to open in IDE
Sign in with your Zerethon account to create your own copy of this sample.
Files
# Insertion Sort
Zerethon Official Sample `insertion-sort`, version 1.2.0, Node.js 22.
- `insertion_sort.js` — the algorithm, as shown in Zerethon Tools
- `main.js` — entry file: a short demonstration
- `test_insertion_sort.js` — checks; set it as the entry file to run them
This project is your own copy. Changing it never changes the official sample.
See the algorithm animated: https://tools.zerethon.com/insertion-sort-visualizer
// Insertion Sort (Zerethon Official Sample: insertion-sort 1.2.0).
function insertionSort(a) {
for (let i = 1; i < a.length; i++) {
const key = a[i];
let j = i - 1;
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
return a;
}
module.exports = { insertionSort };
const { insertionSort } = require('./insertion_sort');
const numbers = [38, 27, 43, 3, 9, 82, 10, 27];
console.log(`Before: [${numbers.join(', ')}]`);
const result = insertionSort([...numbers]);
console.log(`After: [${result.join(', ')}]`);
const expected = [...numbers].sort((x, y) => x - y);
console.log(`Same as sort(): ${result.join() === expected.join()}`);
// Checks for insertionSort. To run them, set this file as the entry file
// (the ▶ button next to it in Files) and press Run.
const assert = require('assert');
const { insertionSort } = require('./insertion_sort');
/** Deterministic pseudo-random integers in [-50, 49]. */
function numbers(seed, count) {
const out = [];
for (let i = 0; i < count; i++) {
seed = (seed * 1103515245 + 12345) % 2 ** 31;
out.push((seed % 100) - 50);
}
return out;
}
const cases = [[], [1], [2, 1], [1, 2, 3], [3, 2, 1], [5, 1, 5, 1, 5], [-3, 0, -1, 2]];
for (const [seed, size] of [[1, 10], [2, 50], [3, 200]]) cases.push(numbers(seed, size));
for (const c of cases) {
const got = insertionSort([...c]);
assert.deepStrictEqual(got, [...c].sort((x, y) => x - y), `insertionSort([${c.slice(0, 6)}...])`);
}
console.log(`All ${cases.length} checks passed.`);
Source: Zerethon Official Sample. Algorithm as shown in the Zerethon Tools Insertion Sort Visualizer.