O(n) indicates linear time complexity where the execution time increases proportionally with the input size, while O(n^2) indicates quadratic time complexity where the execution time grows with the square of the input size. For example, a simple loop iterating through an array has O(n) complexity, whereas a nested loop that compares every element to every other element has O(n^2) complexity.
In depth
O(n) time complexity suggests that if you double the size of your input, the time taken to complete the operation will also roughly double. This is often seen in linear search algorithms or algorithms that simply traverse through an array. On the other hand, O(n^2) time complexity indicates that the time taken will grow quadratically. This occurs frequently in algorithms like bubble sort or insertion sort, where for each element, you might have to perform operations for every other element too. Therefore, for a large dataset, an O(n^2) algorithm can become significantly slower compared to an O(n) algorithm, making it crucial to choose the right data structure or algorithm based on expected input sizes and performance requirements. Edge cases, like very small datasets, may not show a noticeable difference, but they can greatly impact performance as input sizes increase.
Example scenario
In a project where I worked on optimizing a sorting feature for a large e-commerce platform, we initially used a simple bubble sort algorithm that exhibited O(n^2) complexity. As our dataset grew larger, users started to notice significant delays in load times. After analyzing the performance, we switched to a more efficient sorting algorithm like quicksort, which operates on average in O(n log n) time. This reduced processing time dramatically, especially as our product catalog expanded, demonstrating the importance of considering time complexity in algorithm selection.
Common mistakes
One common mistake is not recognizing the implications of time complexity on performance as input sizes scale. Developers often assume that their O(n^2) algorithms will perform adequately for all inputs, only to find significant slowdowns with larger datasets. Another error is failing to analyze the algorithm's complexity before implementation, which can lead to choosing an inefficient approach without realizing it until later stages of development. It's important to evaluate algorithms in the context of expected input sizes and performance needs.
Follow-up questions
- Can you explain how you would optimize an O(n^2) algorithm?
- What are some data structures that can help improve performance in these scenarios?
- When might you choose an O(n^2) algorithm over a more efficient one?
- How do you measure the performance of your algorithms?

Preparing for a system design interview?
- A 7-step method for answering any system design question, plus estimation numbers
- 5 worked designs: URL shortener, rate limiter, chat, news feed and file storage
- Guides to caching, databases, queues, consistency and reliability, with a 4-week study plan
- 306 practice questions with answers on caching, databases, queues, microservices, APIs and more
5 worked designs, a 4-week plan and 306 practice questions with answers.
The material stays free to read online. This is the organised, offline, print-ready PDF edition. Secure payment by PayPal; your personal download link is emailed after payment is confirmed. Digital product, no shipping.