# Sorting & Searching, Explained

You already call `.sort()` and `in` without thinking twice. That's fine for most code - but the moment
something is slow, or an interviewer asks "how would you find this faster," you need the picture underneath
the built-in. Two questions drive almost everything here: *how do I find a value fast?* and *how do I put
things in order in the first place?* Each answer builds on the one before it - sorting exists partly to make
searching faster.

This guide keeps the code in Python so you can run every example as you read.

## How to read this

Read in order - binary search only makes sense once you've felt *why* linear search is slow, and every sort
after bubble sort is really "here's a cleverer way to avoid bubble sort's problem."

## The phases

1. **[Linear vs. Binary Search](01-linear-vs-binary-search.md)** - the two ways to find a value, and why
   sorted order unlocks a dramatically faster search.
2. **[Binary Search, Implemented](02-binary-search-implemented.md)** - the real algorithm on a sorted array,
   its complexity, and the off-by-one bugs that catch almost everyone once.
3. **[Bubble Sort](03-bubble-sort.md)** - the simplest sort there is: compare neighbors, swap, repeat. Slow,
   but it builds the intuition every other sort refines.
4. **[Merge Sort (and Quick Sort)](04-merge-sort-and-quick-sort.md)** - divide and conquer: split the problem
   in half, solve the halves, combine. The shape behind every fast general-purpose sort.
