Empirical complexity

O(n log n) shuffled · O(n²) sorted or reversed·O(log n) space
81632641282565121k2k4.1k8.2k16k33k101001k10k100k1Minput size ncomparisons
  • Quicksort (shuffled)

The axes are set: 13 sizes from 8 to 32,768, against a count that will reach 1,000,000. Nothing has been measured yet.

The axes are set: 13 sizes from 8 to 32,768, against a count that will reach 1,000,000. Nothing has been measured yet.
Fit so far—

Quicksort: O(n log n), claimed as 2(n+1)Hₙ − 4n

  1. 1set up the axes: the sizes to measure, and the counts they will reach
  2. 2take the next size, and build an input of that size in the chosen shape
  3. 3run the algorithm on it, counting one operation at a time
  4. 4plot the point, and refit the textbook bound to everything measured so far
  5. 5stop: report how well the bound fits, and what a handful of sizes cannot prove

What the measurement shows

Nothing has been measured yet. The ladder runs from 8 to 32,768, in 13 steps.

Sizes measured
0
Operations counted
0
Largest single count
0
Comparisons
0
Moves
0

Complexity

BestO(n log n)
AverageO(n log n)
WorstO(n²)
Extra spaceO(log n)

Quicksort

Choose a pivot, move everything smaller than it to the left and everything larger to the right, and then sort the two sides the same way. If the pivot lands near the middle the two sides are half the size and there are log n levels, as in merge sort. If it lands at one end, one side is empty and the other is one shorter, so there are n levels of a scan that is n long — and the pivot used here is the last element, which on sorted or reversed input is always an end. The curve plots comparisons, which is what every textbook bound for a sort is about and what makes the four of them directly comparable. The moves are counted too and shown in the panel beside it — worth a look on merge sort, whose comparison count hides the fact that it touches every element on every level.

The claim being tested

O(n log n) shuffled · O(n²) sorted or reversed

When it is the right choice

It is the default in-place sort in most standard libraries, because its average case has a smaller constant factor than merge sort’s and it needs no scratch array. Real implementations avoid the worst case rather than accept it: a median-of-three or a randomised pivot makes the adversarial input vanishingly unlikely, and several switch to heapsort if the recursion gets too deep. The plain last-element pivot is kept here precisely so the worst case is reachable.

How it works

Worth noticing

Cost

Best
O(n log n)
Average
O(n log n)
Worst
O(n²)
Extra space
O(log n)
n is
the length of a list of numbers
Measures
shuffled: up to n = 131,072; sorted: up to n = 4,096; reversed: up to n = 4,096

The ceilings are a time limit rather than a memory one, which makes this tool the odd one out in the suite. Its recorded steps are tiny — one step per measured size, not one per operation — so nothing about the trace would ever stop a run. What has to be stopped is the measuring itself: a configuration that would take more than forty million operations to count is refused before a single one of them is counted, from a formula in the input sizes rather than by starting and giving up. Two further limits sit beside it that no formula in operations can see: building the input is real work, and a recursion n deep overflows the call stack long before its operation count becomes interesting.

A fit over a dozen sizes is evidence and not proof. It cannot rule out a term that only begins to matter past the largest size measured, and it says nothing at all about the constant factors that decide which of two algorithms in the same class is actually faster on a real machine.

Worth comparing

All measured subjects