This first-semester course is an introduction into the design and analysis of algorithms. On the one hand this includes classical algorithm design patterns including induction, divide-and-conquer and dynamic programming. We study these using classical example such as searching and sorting. On the other hand the course covers the interaction between algorithms and data structures including linked lists, search trees, heaps, and union-find structures. A particular focus are graph algorithms for shortest path and minimal spanning tree problems. We provide the necessary introduction into graph theory as part of this course.