Learning path
Data structures and algorithms (DSA)
Start with Python's full core sequence, or study the same structures and algorithms in C, C++, Java, C#, Kotlin, JavaScript, TypeScript, and other languages. Compare operations, trace state, and reason about complexity.
- 1
Python
Readable code for automation, data, and first programs.
Python algorithm complexity
Compare linear work with quadratic work by counting operations.
Python sets and tuples
Choose uniqueness or immutable grouping to fit the problem.
Python linear search
Find the first matching element without assuming sorted input.
Python binary search
Halve a sorted search interval after each comparison.
Python bubble sort
Move the largest remaining item to the end with adjacent swaps.
Python selection sort
Select the smallest remaining value for each position.
Python insertion sort
Grow a sorted prefix by shifting larger elements.
Python merge sort
Sort halves recursively and merge them in order.
Python quicksort and partitioning
Partition around a pivot, then sort smaller subproblems.
Python stacks and balanced parentheses
Use last-in, first-out storage to match nested parentheses.
Python queues with deque
Process work in first-in, first-out order.
Python dictionaries and frequency counting
Count repeated values using key-value lookup.
Python singly linked lists
Follow node references and insert at the head.
Python binary search trees
Insert ordered keys and traverse them in sorted order.
Python heaps and priority queues
Remove the smallest priority efficiently.
Python graphs and breadth-first search
Visit reachable vertices level by level without revisiting cycles.
Python depth-first search
Explore one branch fully before returning to alternatives.
Python Dijkstra shortest paths
Relax nonnegative weighted edges using a priority queue.
Python dynamic programming
Reuse earlier results instead of recomputing overlapping subproblems.
Python backtracking and subsets
Choose, recurse, and undo to explore a decision tree.
- 2
C
Learn memory, pointers, and efficient systems programming.
C array search with explicit length
Search only within the supplied array bounds.
C linked nodes and traversal
Connect records with pointers and follow a chain.
C array-based stacks and circular queues
Build a fixed-capacity stack and a queue that wraps around the end of its array.
C binary search and the standard bsearch
Find a value in a sorted array in logarithmic time, by hand and with the library function.
C sorting: bubble sort versus quicksort
Implement two sorts, count their comparisons, and see why O(n log n) beats O(n²).
C binary search trees with malloc and free
Allocate tree nodes dynamically, traverse them in order, and release every node.
C string algorithms
Write strlen and strcmp by hand, check palindromes, and count occurrences with strstr.
C dynamic programming: longest common subsequence
Fill a table of subproblem answers to find the longest sequence that two strings share.
- 3
C++
Build fast applications with modern types and classes.
C++ vectors and iterator invalidation
Grow a dynamic array and use checked access.
C++ binary search with lower_bound
Find an insertion position and check whether it is a match.
C++ stack and queue adapters
Compare LIFO and FIFO removal on the same values.
C++ ordered maps and frequencies
Count keys and traverse them in sorted order.
C++ linked lists with unique ownership
Build a node chain with automatic destruction.
C++ sorting: insertion sort, merge sort, and std::stable_sort
Write two sorts by hand and sort records with a comparator, keeping equal items in order.
C++ singly linked list with unique_ptr
Own each node with a unique_ptr, push at the front, reverse the list, and let destructors do the cleanup.
C++ binary search tree traversals
Insert values into a BST and visit them depth-first and level by level.
C++ priority_queue and the top-k pattern
Use a binary heap to get the smallest element quickly, and keep the k largest values of a stream.
C++ graphs: BFS, DFS, and connected components
Store a graph as adjacency lists, visit it breadth-first and depth-first, and count its components.
- 4
Java
Understand object oriented programs and the JVM.
Java ArrayList and generics
Use a resizable, type-checked sequence.
Java binary search and interval bounds
Implement logarithmic search on an ascending array.
Java stacks and balanced brackets
Use a stack to check that brackets are properly nested.
Java ArrayDeque as a queue
Choose queue operations with explicit empty-queue behavior.
Java maps, sets, and duplicate counting
Track counts and distinct values with separate collection roles.
Java singly linked lists
Build a list of nodes by hand, insert at the front and the back, and reverse it.
Java binary search trees
Insert values into a tree that keeps smaller values on the left, and traverse it in sorted order.
Java sorting: insertion sort, merge sort, and comparators
Implement two sorts by hand and sort objects with a Comparator.
Java priority queues and heaps
Always remove the smallest (or largest) item, and find the k largest values.
- 5
C#
Build typed applications on .NET.
C# Lists
Grow a collection with List<T> and add its values.
C# Dictionary and HashSet operations
Count words with a dictionary and combine sets with union, intersection, and difference.
C# Stack and Queue: evaluating postfix expressions
Use a stack to evaluate expressions written in reverse Polish notation and a queue for first-in order.
C# sorting, stability, and Array.BinarySearch
Sort arrays and records, keep equal items in order with LINQ, and find insertion points.
C# LRU cache with Dictionary and LinkedList
Combine a hash table and a doubly linked list so that get, put, and eviction all take constant time.
C# generic binary search tree with IEnumerable
Constrain the element type with IComparable<T> and expose the sorted values with yield return.
- 6
Kotlin
Write concise, typed code for JVM applications.
Kotlin sorting and binary search
Sort lists with sorted and sortedBy, and find a value or its insertion point with binarySearch.
Kotlin ArrayDeque as a stack and a queue
Check balanced brackets with a stack and serve items in arrival order with a queue.
Kotlin maps: counting and indexing
Count words with groupingBy and build a lookup map with getOrPut.
- 7
JavaScript
Add behavior to the web and build applications.
JavaScript binary search
Search a sorted numeric array with a shrinking interval.
JavaScript Map and Set
Count values and identify distinct entries.
JavaScript linked lists and iterators
Build a singly linked list class that can be looped over with for...of.
JavaScript stacks and queues
Use an array as a stack, and write a queue that does not shift the whole array on every removal.
JavaScript sorting and the default sort pitfall
Learn why [10, 9, 1].sort() is wrong, sort with comparators, and write a merge sort.
JavaScript binary search trees with a generator
Insert values, search, and produce the sorted order lazily with a recursive generator.
JavaScript graphs: BFS, DFS, and path existence
Store a graph as a Map of neighbour lists and search it breadth-first and depth-first.
- 8
TypeScript
JavaScript with static types for dependable code.
TypeScript Generics
Write one function that keeps the type of whatever it receives.
TypeScript generic stack and queue
Write containers that work for any element type and keep it checked.
TypeScript generic binary search tree
Order any type with a comparator function and collect the values in sorted order.
TypeScript typed comparators and multi-key sorting
Build comparators from a key with keyof, and combine them to sort by several fields.
- 9
PHP
Learn server-side web programming basics.
PHP Associative Arrays
Map names to values and loop over keys and values.
PHP sorting, usort, and the spaceship operator
Sort arrays by value or by custom rules, and combine several sort keys with <=>.
PHP SPL data structures: stack, queue, and heap
Use the standard SplStack, SplQueue, SplMinHeap, and SplPriorityQueue classes.
- 10
Perl
Explore practical text processing and scripting.
Perl Arrays
Store a list in an @array and loop over it.
Perl Hashes
Map keys to values and print them in a stable order.
Perl sort blocks and the Schwartzian transform
Sort numbers, hash keys by value, and records by computed keys without recomputing the keys.
Perl stacks, queues, and word frequencies
Use push, pop, shift, and unshift as stack and queue operations, and count items with a hash.
- 11
Go
Learn simple, fast programs and explicit control flow.
- 12
Rust
Understand ownership and safe systems code.
- 13
Ruby
Express clear programs with readable syntax.
- 14
Swift
Learn expressive, typed programming for Apple platforms.
- 15
Scala
Combine object oriented and functional programming.
- 16
Lua
Learn a compact language often used for scripting.