Teaching
Textbooks
I am involved with several textbook projects.

The textbook
Algorithms, 4th Edition, by Bob
Sedgewick and Kevin Wayne, surveys
the most important computer algorithms in use today.
We motivate each algorithm and data structure that we we address by
examining its impact on specific applications.
We emphasize applications to science, engineering, and commerce.

The textbook
Introduction to Programming in Java: An Interdisciplinary Approach,
by Bob Sedgewick and Kevin Wayne, is an interdisciplinary approach to the traditional CS1 curriculum.
We teach all of the classic elements of programming, using an "objectsinthemiddle"
approach that emphasizes data abstraction.

The textbook
Introduction to Programming in Python: An Interdisciplinary Approach,
by Robert Dondero, Bob Sedgewick, and Kevin Wayne is a Python version of the introductory
Java book.

I designed a set of lecture slides
to supplement the textbook
Algorithm Design
by Jon Kleinberg and and Éva Tardos.
The slides are distributed by
Pearson AddisonWesley.
Courses
I teach courses in data structures, algorithms, optimization, and
introductory computer science. Here's a link to some of the course
materials:

Princeton COS 126: General Computer Science.
This is an introduction to computing for scientists and engineers.
The goal of this course is to explain what a computer really is and to reveal the
mystery of how it works, from silicon to circuits to machine language to
programming languages to scientific applications. Here are the
lecture slides.

Princeton COS 226:
Algorithms and Data Structures.
This course surveys the most important data structures and algorithms
in use on computers today. Particular emphasis is given to algorithms for sorting,
searching, string processing, and graph processing.
The course concentrates on developing implementations, understanding their performance
characteristics, and estimating their potential effectiveness in
scientific and commercial applications.
Here are the
lecture slides.

Princeton COS 423:
Theory of Algorithms.
This course focuses on the design and analysis of computer algorithms from
a mathematically sophisticated viewpoint. Design paradigms include
greed, divideandconquer, dynamic programming and reduction.
Here are the
lecture slides.

I've compiled a list of
creative programming assignments
from COS 126 and COS 226. The problems are drawn from many areas including:
computational biology, physics, chemistry, computer graphics, recreational
mathematics, cryptography,
data compression, operations research, sociology, sports, geographic
information systems, and linguistics.
Currently the assignments are in C and Java, but they could easily be modified
for C++ or other languages.
Guest Lectures
Teaching Tools
I supervise projects to design teaching tools for
the introductory computer science curriculum at Princeton.
Here are some of my favorites that you might find useful too.
The source code is freely available.

Graph Algorithms.
Some algorithmic visualizations of Prim's algorithm, Kruskal's algorithm, TSP heuristics,
and Euclidean shortest path. Written by Paul Simbi.

Growing Tree.
A splendid binary tree tool that provides algorithmic visualizations of
binary search trees, redblack trees, and splay trees. Written by Corey Sanders.
 Mandelbrot Set Explorer.
A gratuitous link to my first Java applet.

Turing Machine Simulator. There are lots of Turing machine simulators out there,
but this is the best one I've seen. Provides nice visualizations of Turing machine
in action. Uses Minsky notation for simplicity. Written by Tom Ventimiglia.

XTOY Simulator. The TOY machine is a simple machine designed at Princeton to teach
the basics of machine architecture and machine language programming. This simulator
provides a stunning visualization of the PDP8style machine as well as an IDE for
writing programs in the TOY machine language. Written by Brian Tsang.