I am involved with several textbook projects.
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 "objects-in-the-middle"
approach that emphasizes data abstraction.
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.
I designed a set of lecture slides
to supplement the textbook
by Jon Kleinberg and and Éva Tardos.
The slides are distributed by
I teach courses in data structures, algorithms, optimization, and
introductory computer science. Here's a link to some of the course
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
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
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, divide-and-conquer, dynamic programming and reduction.
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
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.
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.
Some algorithmic visualizations of Prim's algorithm, Kruskal's algorithm, TSP heuristics,
and Euclidean shortest path. Written by Paul Simbi.
A splendid binary tree tool that provides algorithmic visualizations of
binary search trees, red-black trees, and splay trees. Written by Corey Sanders.
- Mandelbrot Set Explorer.
A gratuitous link to my first Java applet.
Simple C Simulator. This is a very simple IDE for a subset of the C language.
It is useful for tracing through C programs in lecture. Written by Brian Tsang.
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.
to help manage courses, including grades, electronic assignment submissions,
and course web pages. Written by Todd Templeton.
X-TOY 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 PDP8-style machine as well as an IDE for
writing programs in the TOY machine language. Written by Brian Tsang.