This document presents a comprehensive solution to an algorithm assignment, delving into the analysis of various search and sorting algorithms. The solution begins with an analysis of binary search, including its time complexity under different array passing methods (pointer, copy of array and sub range of array). It then proceeds to analyze merge sort, similarly considering different array passing methods and their impact on time complexity. The assignment also addresses the validity of certain Big O notation statements, providing proofs and counterexamples. Furthermore, it includes detailed explanations and code for sorting algorithms like counting sort, quick sort with Lomuto partitioning, and insertion sort, including their stability and implementation. Finally, the assignment ranks several functions by their asymptotic growth, using a tabulation method to compare their behavior as the input size increases. This assignment provides a detailed understanding of algorithm analysis and design principles.