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 Computer Science: An Interdisciplinary Approach, by Bob Sedgewick and Kevin Wayne, is an interdisciplinary approach to the teaching computer science. The first half of the book includes all of the classic elements of programming, using an "objectsinthemiddle" approach that emphasizes data abstraction. The second half of the book explores core ideas of Turing, von Neumann, Shannon, and others that ignited the digital age.

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 Bob Sedgewick, Kevin Wayne, and Robert Dondero 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.
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 (Computer Science: An Interdisciplinary Approach). 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.
 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.
 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.
MOOCs
I have codeveloped several MOOCs (with Bob Sedgewick). All are freely available on the Coursera platform. Algorithms, Part I. Essential information that every serious programmer needs to know about algorithms and data structures, with emphasis on applications and scientific performance analysis of Java implementations. Part I covers elementary data structures, sorting, and searching algorithms.
 Algorithms, Part II. Essential information that every serious programmer needs to know about algorithms and data structures, with emphasis on applications and scientific performance analysis of Java implementations. Part II focuses on graph and stringprocessing algorithms.
 Computer Science: Programming with a Purpose. Teaches programming to those who need or want to learn it, in a scientific context. We begin by introducing basic programming elements such as variables, conditionals, loops, arrays, and I/O. Next, we turn to functions, introducing key concepts such as recursion, modular programming, and code reuse. Then, we present a modern introduction to objectoriented programming.
 Computer Science: Algorithms, Theory, and Machines. Introduces the broader discipline of computer science to people having basic familiarity with Java programming. Includes classic algorithms for sorting and searching; computability, univerality, and intractability; machinelanguage programming and its relationship to coding in Java; and logic design.
Software
Here are some software projects that I maintain that are used at Princeton and beyond. This Github repositiory contains the Java source code from the textbook Algorithms 4/e. The code has been ported to Scala, .NET, Python, and Go.
 Java autoinstallers.
 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.
Nifty Assignments
I have developed and codeveloped many novel programming assignments. Several have been designated as Nifty Assignments by the ACM Technical Symposium on Computer Science Education (SIGCSE). These assignments have been adopted at many colleges and universities around the world. WordNet. Analyze the WordNet lexicon (using digraphs).
 Percolation. Estimate the percolation threshold (using union–find).
 Seam carver. Perform contentaware resizing of images (via shortest paths).
 Sequence alignment. Align DNA sequences (using dynamic programming).
 Image classifier. Classify images using the perceptron algorithm (using objects).
 Purple America. Develop a visualization of U.S. election results (using graphics).
 Bar chart racer. Create an animate bar chart using realworld data (using sorting).
 Guitar Heroine. Simulate and sonify the plucking of a guitar string (using objects).
 PageRank. Rank the importance of web pages via PageRank (using Markov chains).
 Particle collision simulation. Simulate systems of colliding particles (using priority queues).
 Autocomplete me. Implement autocompletion for a list of terms (using sorting and binary search).
 Atomic nature of matter. Estimate Avogadro’s number by analyzing video microscopy data (using DFS).
 Nbody simulation. Simulate the motion of n bodies according to Newton’s laws of gravity (using arrays).
Teaching Awards
 The textbook Algorithms, 4th Edition was named as one of The 25 Best Programming Books of AllTime in 2020.
 The MOOC Algorithms, Part I was recognized as one of the Top 25 Most Popular Courses During the Pandemic and one of the Best Online Courses of All Time by Class Central in 2020.
 Named the 2019 Outstanding Teacher in Computer Science at a Ph.D. Granting Institution in New Jersey. This is awarded by the Chairs of New Jersey Computer Science Departments.
 The textbook Computer Science: An Interdisciplinary Approach was named a 2016 ACM Computing Reviews Notable Book.
 Named a 2014 ACM Distinguished Educator for impact on the field of computer science education. The ACM, which has more than 100,000 members worldwide, selects only 2–5 such members annually.
 Winner of 2013 Phi Beta Kappa Teaching Award, Princeton University. This is the only campuswide teaching award that is decided entirely by students.
 Winner of 2011 Distinguished Teacher Award, Princeton University School of Engineering and Applied Science. This is the highest teaching honor conferred by SEAS.
 Repeat winner of the Engineering Council’s Excellence in Teaching Award, Princeton University, including in fall 2019. This is awarded by engineering students.
 Repeat recipient of the Commendation List for Outstanding Teaching, Princeton University School of Engineering and Applied Science, including in fall 2020. This is awarded by the Dean of SEAS.