javascript-algorithms
📝 Algorithms and data structures implemented in JavaScript with explanations and links to further readings
Top Related Projects
Algorithms and Data Structures implemented in JavaScript for beginners, following best practices.
💯 Curated coding interview preparation materials for busy software engineers
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
Everything you need to know to get the job.
A complete computer science study plan to become a software engineer.
🌐 Front End interview preparation materials for busy engineers (updated for 2025)
Quick Overview
The trekhleb/javascript-algorithms repository is a comprehensive collection of JavaScript implementations of various algorithms and data structures. It serves as an educational resource for developers to learn about fundamental computer science concepts and their practical applications in JavaScript.
Pros
- Extensive coverage of algorithms and data structures
- Well-documented code with explanations and complexity analysis
- Includes unit tests for each implementation
- Regularly maintained and updated
Cons
- May be overwhelming for beginners due to the large number of algorithms
- Some implementations might not be optimized for production use
- Lacks advanced or specialized algorithms in certain domains
- Limited explanations of theoretical concepts behind the algorithms
Code Examples
- Binary Search implementation:
function binarySearch(sortedArray, seekElement) {
let startIndex = 0;
let endIndex = sortedArray.length - 1;
while (startIndex <= endIndex) {
const middleIndex = startIndex + Math.floor((endIndex - startIndex) / 2);
if (sortedArray[middleIndex] === seekElement) {
return middleIndex;
}
if (sortedArray[middleIndex] < seekElement) {
startIndex = middleIndex + 1;
} else {
endIndex = middleIndex - 1;
}
}
return -1;
}
- Bubble Sort implementation:
function bubbleSort(originalArray) {
const array = [...originalArray];
for (let i = 1; i < array.length; i += 1) {
for (let j = 0; j < array.length - i; j += 1) {
if (array[j] > array[j + 1]) {
[array[j], array[j + 1]] = [array[j + 1], array[j]];
}
}
}
return array;
}
- Linked List implementation:
class LinkedListNode {
constructor(value, next = null) {
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
}
append(value) {
const newNode = new LinkedListNode(value);
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
return this;
}
}
Getting Started
To use the algorithms and data structures in your project:
-
Clone the repository:
git clone https://github.com/trekhleb/javascript-algorithms.git -
Navigate to the desired algorithm or data structure in the
srcdirectory. -
Copy the implementation into your project or import it directly:
import { binarySearch } from './path/to/binary-search'; const array = [1, 2, 3, 4, 5]; const result = binarySearch(array, 3); console.log(result); // Output: 2 -
Refer to the accompanying README files for usage instructions and complexity analysis.
Competitor Comparisons
Algorithms and Data Structures implemented in JavaScript for beginners, following best practices.
Pros of JavaScript
- More comprehensive coverage of algorithms and data structures
- Better organization with categorized folders for different types of algorithms
- Includes unit tests for most implementations, enhancing reliability
Cons of JavaScript
- Less detailed explanations and comments in the code
- Fewer language-specific optimizations compared to javascript-algorithms
- Some implementations may be less efficient or not follow best practices
Code Comparison
javascript-algorithms (Binary Search):
function binarySearch(sortedArray, seekElement) {
let startIndex = 0;
let endIndex = sortedArray.length - 1;
while (startIndex <= endIndex) {
const middleIndex = startIndex + Math.floor((endIndex - startIndex) / 2);
// ... (rest of the implementation)
}
return -1;
}
JavaScript (Binary Search):
function binarySearch(arr, x, low = 0, high = arr.length - 1) {
if (high >= low) {
const mid = Math.floor((high + low) / 2);
if (arr[mid] === x) return mid;
if (arr[mid] > x) return binarySearch(arr, x, low, mid - 1);
return binarySearch(arr, x, mid + 1, high);
}
return -1;
}
The JavaScript implementation uses recursion, while javascript-algorithms uses an iterative approach. The latter provides more detailed comments and explanations within the code.
💯 Curated coding interview preparation materials for busy software engineers
Pros of tech-interview-handbook
- Broader scope, covering various aspects of tech interviews beyond algorithms
- Includes non-technical interview preparation and career advice
- Provides curated lists of resources and study materials
Cons of tech-interview-handbook
- Less focused on in-depth algorithm implementations
- May not provide as much hands-on coding practice
- JavaScript-specific content is more limited
Code Comparison
tech-interview-handbook:
// Example of a coding question from the handbook
function reverseString(str) {
return str.split('').reverse().join('');
}
javascript-algorithms:
// Example of a more detailed algorithm implementation
export default class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
}
The code comparison shows that javascript-algorithms tends to provide more detailed implementations of data structures and algorithms, while tech-interview-handbook focuses on concise examples and explanations of common interview questions.
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
Pros of system-design-primer
- Comprehensive coverage of system design concepts and principles
- Includes real-world examples and case studies from large-scale systems
- Provides visual aids and diagrams to illustrate complex concepts
Cons of system-design-primer
- Focuses primarily on high-level system design, less on implementation details
- May be overwhelming for beginners due to the breadth of topics covered
- Less hands-on coding practice compared to javascript-algorithms
Code Comparison
system-design-primer (Python):
class Store(object):
def __init__(self, id, name):
self.id = id
self.name = name
javascript-algorithms (JavaScript):
class BinaryTreeNode {
constructor(value = null) {
this.left = null;
this.right = null;
this.value = value;
}
}
The code snippets demonstrate the difference in focus between the two repositories. system-design-primer provides examples of high-level system components, while javascript-algorithms offers implementations of specific data structures and algorithms.
Everything you need to know to get the job.
Pros of interviews
- Covers a broader range of topics, including system design and object-oriented design
- Includes solutions in multiple programming languages (Java, Python, C++, etc.)
- Provides more comprehensive explanations and resources for each topic
Cons of interviews
- Less focused on JavaScript-specific implementations
- Not as frequently updated as javascript-algorithms
- Repository structure is less organized, making it harder to navigate
Code Comparison
interviews (Java):
public ListNode reverseList(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}
javascript-algorithms (JavaScript):
export default function reverseLinkedList(linkedList) {
let currNode = linkedList.head;
let prevNode = null;
let nextNode = null;
while (currNode) {
nextNode = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = nextNode;
}
linkedList.head = prevNode;
return linkedList;
}
Both repositories offer valuable resources for algorithm and data structure preparation. interviews provides a more comprehensive coverage of interview topics across multiple languages, while javascript-algorithms focuses specifically on JavaScript implementations with a well-organized structure.
A complete computer science study plan to become a software engineer.
Pros of coding-interview-university
- Comprehensive coverage of computer science fundamentals
- Language-agnostic approach, suitable for various programming languages
- Includes study plans and learning resources beyond just algorithms
Cons of coding-interview-university
- Less focused on practical implementation of algorithms
- May be overwhelming for beginners due to its extensive content
- Lacks specific code examples for immediate practice
Code Comparison
coding-interview-university doesn't provide direct code examples, while javascript-algorithms offers implementations. For instance, javascript-algorithms includes:
function binarySearch(sortedArray, seekElement) {
let startIndex = 0;
let endIndex = sortedArray.length - 1;
while (startIndex <= endIndex) {
const middleIndex = startIndex + Math.floor((endIndex - startIndex) / 2);
// ... (implementation continues)
}
}
coding-interview-university would typically link to external resources or provide pseudocode explanations instead of direct implementations.
Summary
javascript-algorithms focuses on practical JavaScript implementations of algorithms and data structures, making it ideal for hands-on learners and those specifically interested in JavaScript. coding-interview-university offers a broader, language-agnostic approach to computer science fundamentals and interview preparation, suitable for those seeking a comprehensive understanding across multiple topics. The choice between the two depends on the learner's goals, preferred learning style, and specific language interests.
🌐 Front End interview preparation materials for busy engineers (updated for 2025)
Pros of Front-end Interview Handbook
- Focuses specifically on front-end development topics, making it more targeted for web developers
- Includes a wider range of interview-related content, such as behavioral questions and resume tips
- Offers content in multiple languages, making it accessible to a broader audience
Cons of Front-end Interview Handbook
- Less emphasis on in-depth algorithm implementations and explanations
- May not be as useful for developers looking to improve their general programming skills beyond front-end development
Code Comparison
Front-end Interview Handbook (HTML example):
<button onclick="alert('Hello, World!')">Click me</button>
JavaScript Algorithms (Algorithm example):
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
The code comparison highlights the different focus areas of each repository. Front-end Interview Handbook provides examples related to web development, while JavaScript Algorithms offers implementations of various algorithms and data structures.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
JavaScript Algorithms and Data Structures
ðºð¦ UKRAINE IS BEING ATTACKED BY RUSSIAN ARMY. CIVILIANS ARE GETTING KILLED. RESIDENTIAL AREAS ARE GETTING BOMBED.
- Help Ukraine via:
- More info on war.ukraine.ua and MFA of Ukraine
This repository contains JavaScript based examples of many popular algorithms and data structures.
Each algorithm and data structure has its own separate README with related explanations and links for further reading (including ones to YouTube videos).
Read this in other languages: ç®ä½ä¸æ, ç¹é«ä¸æ, íêµì´, æ¥æ¬èª, Polski, Français, Español, Português, Ð ÑÑÑкий, Türkçe, Italiano, Bahasa Indonesia, УкÑаÑнÑÑка, Arabic, Tiếng Viá»t, Deutsch, Uzbek, ×¢×ר×ת
Data Structures
A data structure is a particular way of organizing and storing data in a computer so that it can be accessed and modified efficiently. More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.
Remember that each data has its own trade-offs. And you need to pay attention more to why you're choosing a certain data structure than to how to implement it.
B - Beginner, A - Advanced
BLinked ListBDoubly Linked ListBQueueBStackBHash TableBHeap - max and min heap versionsBPriority QueueATrieATreeABinary Search TreeAAVL TreeARed-Black TreeASegment Tree - with min/max/sum range queries examplesAFenwick Tree (Binary Indexed Tree)
AGraph (both directed and undirected)ADisjoint Set - a unionâfind data structure or mergeâfind setABloom FilterALRU Cache - Least Recently Used (LRU) cache
Algorithms
An algorithm is an unambiguous specification of how to solve a class of problems. It is a set of rules that precisely define a sequence of operations.
B - Beginner, A - Advanced
Algorithms by Topic
- Math
BBit Manipulation - set/get/update/clear bits, multiplication/division by two, make negative etc.BBinary Floating Point - binary representation of the floating-point numbers.BFactorialBFibonacci Number - classic and closed-form versionsBPrime Factors - finding prime factors and counting them using Hardy-Ramanujan's theoremBPrimality Test (trial division method)BEuclidean Algorithm - calculate the Greatest Common Divisor (GCD)BLeast Common Multiple (LCM)BSieve of Eratosthenes - finding all prime numbers up to any given limitBIs Power of Two - check if the number is power of two (naive and bitwise algorithms)BPascal's TriangleBComplex Number - complex numbers and basic operations with themBRadian & Degree - radians to degree and backwards conversionBFast PoweringBHorner's method - polynomial evaluationBMatrices - matrices and basic matrix operations (multiplication, transposition, etc.)BEuclidean Distance - distance between two points/vectors/matricesAInteger PartitionASquare Root - Newton's methodALiu Hui Ï Algorithm - approximate Ï calculations based on N-gonsADiscrete Fourier Transform - decompose a function of time (a signal) into the frequencies that make it up
- Sets
BCartesian Product - product of multiple setsBFisherâYates Shuffle - random permutation of a finite sequenceAPower Set - all subsets of a set (bitwise, backtracking, and cascading solutions)APermutations (with and without repetitions)ACombinations (with and without repetitions)ALongest Common Subsequence (LCS)ALongest Increasing SubsequenceAShortest Common Supersequence (SCS)AKnapsack Problem - "0/1" and "Unbound" onesAMaximum Subarray - "Brute Force" and "Dynamic Programming" (Kadane's) versionsACombination Sum - find all combinations that form specific sum
- Strings
BHamming Distance - number of positions at which the symbols are differentBPalindrome - check if the string is the same in reverseALevenshtein Distance - minimum edit distance between two sequencesAKnuthâMorrisâPratt Algorithm (KMP Algorithm) - substring search (pattern matching)AZ Algorithm - substring search (pattern matching)ARabin Karp Algorithm - substring searchALongest Common SubstringARegular Expression Matching
- Searches
BLinear SearchBJump Search (or Block Search) - search in sorted arrayBBinary Search - search in sorted arrayBInterpolation Search - search in uniformly distributed sorted array
- Sorting
BBubble SortBSelection SortBInsertion SortBHeap SortBMerge SortBQuicksort - in-place and non-in-place implementationsBShellsortBCounting SortBRadix SortBBucket Sort
- Linked Lists
- Trees
BDepth-First Search (DFS)BBreadth-First Search (BFS)
- Graphs
BDepth-First Search (DFS)BBreadth-First Search (BFS)BKruskalâs Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphADijkstra Algorithm - finding the shortest paths to all graph vertices from single vertexABellman-Ford Algorithm - finding the shortest paths to all graph vertices from single vertexAFloyd-Warshall Algorithm - find the shortest paths between all pairs of verticesADetect Cycle - for both directed and undirected graphs (DFS and Disjoint Set based versions)APrimâs Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphATopological Sorting - DFS methodAArticulation Points - Tarjan's algorithm (DFS based)ABridges - DFS based algorithmAEulerian Path and Eulerian Circuit - Fleury's algorithm - Visit every edge exactly onceAHamiltonian Cycle - Visit every vertex exactly onceAStrongly Connected Components - Kosaraju's algorithmATravelling Salesman Problem - shortest possible route that visits each city and returns to the origin city
- Cryptography
BPolynomial Hash - rolling hash function based on polynomialBRail Fence Cipher - a transposition cipher algorithm for encoding messagesBCaesar Cipher - simple substitution cipherBHill Cipher - substitution cipher based on linear algebra
- Machine Learning
BNanoNeuron - 7 simple JS functions that illustrate how machines can actually learn (forward/backward propagation)Bk-NN - k-nearest neighbors classification algorithmBk-Means - k-Means clustering algorithm
- Image Processing
BSeam Carving - content-aware image resizing algorithm
- Statistics
BWeighted Random - select the random item from the list based on items' weights
- Evolutionary algorithms
AGenetic algorithm - example of how the genetic algorithm may be applied for training the self-parking cars
- Uncategorized
BTower of HanoiBSquare Matrix Rotation - in-place algorithmBJump Game - backtracking, dynamic programming (top-down + bottom-up) and greedy examplesBUnique Paths - backtracking, dynamic programming and Pascal's Triangle based examplesBRain Terraces - trapping rain water problem (dynamic programming and brute force versions)BRecursive Staircase - count the number of ways to reach to the top (4 solutions)BBest Time To Buy Sell Stocks - divide and conquer and one-pass examplesBValid Parentheses - check if a string has valid parentheses (using stack)AN-Queens ProblemAKnight's Tour
Algorithms by Paradigm
An algorithmic paradigm is a generic method or approach which underlies the design of a class of algorithms. It is an abstraction higher than the notion of an algorithm, just as an algorithm is an abstraction higher than a computer program.
- Brute Force - look at all the possibilities and selects the best solution
BLinear SearchBRain Terraces - trapping rain water problemBRecursive Staircase - count the number of ways to reach the topAMaximum SubarrayATravelling Salesman Problem - shortest possible route that visits each city and returns to the origin cityADiscrete Fourier Transform - decompose a function of time (a signal) into the frequencies that make it up
- Greedy - choose the best option at the current time, without any consideration for the future
BJump GameAUnbound Knapsack ProblemADijkstra Algorithm - finding the shortest path to all graph verticesAPrimâs Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphAKruskalâs Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graph
- Divide and Conquer - divide the problem into smaller parts and then solve those parts
BBinary SearchBTower of HanoiBPascal's TriangleBEuclidean Algorithm - calculate the Greatest Common Divisor (GCD)BMerge SortBQuicksortBTree Depth-First Search (DFS)BGraph Depth-First Search (DFS)BMatrices - generating and traversing the matrices of different shapesBJump GameBFast PoweringBBest Time To Buy Sell Stocks - divide and conquer and one-pass examplesAPermutations (with and without repetitions)ACombinations (with and without repetitions)AMaximum Subarray
- Dynamic Programming - build up a solution using previously found sub-solutions
BFibonacci NumberBJump GameBUnique PathsBRain Terraces - trapping rain water problemBRecursive Staircase - count the number of ways to reach the topBSeam Carving - content-aware image resizing algorithmALevenshtein Distance - minimum edit distance between two sequencesALongest Common Subsequence (LCS)ALongest Common SubstringALongest Increasing SubsequenceAShortest Common SupersequenceA0/1 Knapsack ProblemAInteger PartitionAMaximum SubarrayABellman-Ford Algorithm - finding the shortest path to all graph verticesAFloyd-Warshall Algorithm - find the shortest paths between all pairs of verticesARegular Expression Matching
- Backtracking - similarly to brute force, try to generate all possible solutions, but each time you generate the next solution, you test
if it satisfies all conditions and only then continue generating subsequent solutions. Otherwise, backtrack and go on a
different path to finding a solution. Normally the DFS traversal of state-space is being used.
BJump GameBUnique PathsBPower Set - all subsets of a setAHamiltonian Cycle - Visit every vertex exactly onceAN-Queens ProblemAKnight's TourACombination Sum - find all combinations that form specific sum
- Branch & Bound - remember the lowest-cost solution found at each stage of the backtracking search, and use the cost of the lowest-cost solution found so far as a lower bound on the cost of a least-cost solution to the problem in order to discard partial solutions with costs larger than the lowest-cost solution found so far. Normally, BFS traversal in combination with DFS traversal of state-space tree is being used.
How to use this repository
Install all dependencies
npm install
Run ESLint
You may want to run it to check code quality.
npm run lint
Run all tests
npm test
Run tests by name
npm test -- 'LinkedList'
Troubleshooting
If linting or testing is failing, try to delete the node_modules folder and re-install npm packages:
rm -rf ./node_modules
npm i
Also, make sure that you're using the correct Node version (>=16). If you're using nvm for Node version management you may run nvm use from the root folder of the project and the correct version will be picked up.
Playground
You may play with data-structures and algorithms in ./src/playground/playground.js file and write
tests for it in ./src/playground/__test__/playground.test.js.
Then just, simply run the following command to test if your playground code works as expected:
npm test -- 'playground'
Useful Information
References
Big O Notation
Big O notation is used to classify algorithms according to how their running time or space requirements grow as the input size grows. On the chart below, you may find the most common orders of growth of algorithms specified in Big O notation.

Source: Big O Cheat Sheet.
Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data.
| Big O Notation | Type | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
|---|---|---|---|---|
| O(1) | Constant | 1 | 1 | 1 |
| O(log N) | Logarithmic | 3 | 6 | 9 |
| O(N) | Linear | 10 | 100 | 1000 |
| O(N log N) | n log(n) | 30 | 600 | 9000 |
| O(N^2) | Quadratic | 100 | 10000 | 1000000 |
| O(2^N) | Exponential | 1024 | 1.26e+29 | 1.07e+301 |
| O(N!) | Factorial | 3628800 | 9.3e+157 | 4.02e+2567 |
Data Structure Operations Complexity
| Data Structure | Access | Search | Insertion | Deletion | Comments |
|---|---|---|---|---|---|
| Array | 1 | n | n | n | |
| Stack | n | n | 1 | 1 | |
| Queue | n | n | 1 | 1 | |
| Linked List | n | n | 1 | n | |
| Hash Table | - | n | n | n | In case of perfect hash function costs would be O(1) |
| Binary Search Tree | n | n | n | n | In case of balanced tree costs would be O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | False positives are possible while searching |
Array Sorting Algorithms Complexity
| Name | Best | Average | Worst | Memory | Stable | Comments |
|---|---|---|---|---|---|---|
| Bubble sort | n | n2 | n2 | 1 | Yes | |
| Insertion sort | n | n2 | n2 | 1 | Yes | |
| Selection sort | n2 | n2 | n2 | 1 | No | |
| Heap sort | n log(n) | n log(n) | n log(n) | 1 | No | |
| Merge sort | n log(n) | n log(n) | n log(n) | n | Yes | |
| Quick sort | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space |
| Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | |
| Counting sort | n + r | n + r | n + r | n + r | Yes | r - biggest number in array |
| Radix sort | n * k | n * k | n * k | n + k | Yes | k - length of longest key |
Project Backers
You may support this project via â¤ï¸ï¸ GitHub or â¤ï¸ï¸ Patreon.
Folks who are backing this project â = 1
Author
A few more projects and articles about JavaScript and algorithms on trekhleb.dev
Top Related Projects
Algorithms and Data Structures implemented in JavaScript for beginners, following best practices.
💯 Curated coding interview preparation materials for busy software engineers
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
Everything you need to know to get the job.
A complete computer science study plan to become a software engineer.
🌐 Front End interview preparation materials for busy engineers (updated for 2025)
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot