The Most Important Algorithms
This reads like a textbook, i.e. it's algorithms that are highly useful to CS professors and students but not necessarily to practitioners.  If I had to pick a top-10 list based on my professional experience, it would be:<p>1. Tree traversal.  This comes up <i>all the time</i>, from directory walks to DOM traversal to code analysis to folds over abstract data types.  It's also something that you need to know and can't always rely on having a library function for, because many things exhibit tree-like structure without actually being instances of your language's Tree data type.<p>2. Hashing.  Obviously as a base for hashtables (which are often your dictionary data structure of choice), but also as a general technique for generating a small fingerprint from a large set of data.<p>3. Statistics - mean/median/mode, but also things like confidence intervals, regressions, sample sizes, how to make sure your populations unbiased, etc..  You are evaluating your product, right?  Knowing how to make good inferences from data is critical, particularly since there're lots of ways you can do it wrong.<p>4. Sorting.  This can usually be hidden behind a library function, but it's useful to understand because many other algorithms have very different (and often better) performance characteristics if the input data is kept sorted.  Binary search falls into this bullet point too.<p>5. Data compression algorithms.  Another one that you'll rarely have to directly implement, but knowing their characteristics helps you make good speed/space tradeoffs for the rest of the system.<p>6. Bloom filters.  This is one that I never learned in school but tends to be incredibly useful when dealing with massive data sets.  Oftentimes, you want to be able to quickly <i>reject</i> elements if they're <i>not</i> in a set, but don't really care about it taking a while if they <i>are</i> in a set (because you expect that many more elements will be outside of the set than inside it).  A Bloom filter is one of the fastest, most space-efficient ways to do this.<p>7. Topological sort.  Dependency graphs come up all the time in practical programming problems, and usually you want a way to linearize them into a list of tasks that you can perform in order.  It's also a shame that many languages' standard libraries don't have a topological sort function, so oftentimes you <i>will</i> have to implement this one yourself.<p>8. Support vector machines.  These are your bread & butter machine-learning classifiers, and are really nice to know when you've got a bunch of data and want to try to automate some rote classification job.<p>9. Physics simulations.  I've found it surprising how useful my intro physics course knowledge has been.  Things like vectors, position vs. velocity vs. acceleration, damped harmonic oscillators, FFTs, etc.  It's most useful when building UIs and games - oftentimes, you can make a UI feel significantly more natural by adding easing functions that behave like acceleration when you ease in and frictional damping when you ease out.<p>10. Unification.  I'm probably biased because a lot of my hobby programming is in compilers & type systems, but unification comes up all the time in compilers, and is a really general technique for equation solving.