A comprehensive course covering search and sorting algorithms, recursion, and essential data structures through hands-on implementations in C.
This repository contains laboratory assignments and implementations from the Informatics II course at the University of Zurich (Spring Semester 2024). The course provides in-depth coverage of algorithmic thinking and data structure design through practical C implementations, building a strong foundation in computer science fundamentals.
Grade: 5.25/6.0 | ECTS: 6
- Sorting Algorithms: Bubble Sort, Insertion Sort, Quick Sort, Heap Sort
- Search Algorithms: Linear and binary search implementations
- Algorithmic Analysis: Complexity analysis, Big-O notation, correctness proofs, and recurrence relations
- Recursion: Problem decomposition and recursive algorithm design
- Divide and Conquer: Algorithm paradigm with recurrence relation solving
- Linear Structures: Arrays, Linked Lists, Stacks, Queues, Abstract Data Types (ADTs)
- Trees: Binary Trees, Binary Search Trees (BST), AVL Trees, Red-Black Trees
- Hash Tables: Hash functions and collision resolution
- Memory Management: Pointers, manual memory allocation, and low-level C programming
├── Lab 0 - C-Environment/
├── Lab 1 - Introduction to C, Basic Sorting/
├── Lab 2 - Recursion/
├── Lab 3 - Complexity, Correctness/
├── Lab 4 - Divide and Conquer, Recurrence/
├── Lab 5 - Heap Sort, Quick Sort/
├── Lab 6 - Pointers, Linked Lists/
├── Lab 7 - ADTs, Stacks, Queues/
├── Lab 8 - Binary Trees, BST/
├── Lab 9 - Red-Black Trees/
└── Lab 10 - Hash Tables/
Each laboratory directory contains:
- C source files implementing the covered algorithms and data structures
- Executable binaries and debug symbols (dSYM for macOS)
- Hands-on implementations demonstrating theoretical concepts
- Progressive difficulty building from basic sorting to advanced tree structures
- Understand and apply time and space complexity analysis
- Implement fundamental algorithms and compare their performance
- Design and implement custom data structures from scratch
- Apply the Divide and Conquer paradigm and solve recurrence relations
- Work effectively with pointers and dynamic memory management
- Analyze algorithmic correctness and prove algorithm properties
- Build complex data structures: Trees, Hash Tables, and ADTs
Course instructors: Michael Hanspeter Böhlen and team