Big-O notation is the common language programmers and computer scientists use to compare how efficient algorithms are. Instead of measuring exact running time, which depends on the machine and language, it describes how the work grows as the input size grows. An algorithm that is O(n) does work roughly proportional to the input size n; one that is O(n^2) does work proportional to the square of the size; one that is O(log n) grows very slowly.
The key idea is that constant factors and lower-order terms are dropped, so the notation captures the shape of the growth rather than precise counts. This is what lets us say, regardless of hardware, that an O(n log n) sort will eventually beat an O(n^2) sort once the input is large enough.
The family of related symbols was given firm definitions for computer science by Donald Knuth, who in his 1976 SIGACT News note “Big Omicron and Big Omega and Big Theta” argued for using O for upper bounds, Omega for lower bounds, and Theta for a tight bound that is both at once. Knuth borrowed the O (“big oh,” or omicron) from older mathematical usage and pinned down a consistent meaning for the analysis of algorithms.
The notation underpins how complexity classes are described. As the Stanford Encyclopedia entry on computational complexity explains, the boundary of feasibility is often drawn at polynomial time, that is, running time in O(n^k) for some fixed k, which is why big-O language is inseparable from the study of tractable and intractable problems.