The original question can get you thinking very close to contemporary problems, with only modest variations. We should have more longevity built into our textbooks.
x = [(randint(20,80), "John Smith") for x in range(2_300_000)]
x.sort(key=lambda x: x[0])
x[2_300_000//2]
Takes under a second. You can expand it to generate random names rather than just ages, if you feel like it, but the end result wouldn't be much different.In short: this is something you shouldn't even think about in modern computers since it's that fast.
In this day and age it would be like trying to sort 100 TB of data. Not a hard problem, but not exactly something you do daily either. And still dreadfully slow since you need to use disk memory while copying everything over.
A more modern version of the question would be:
>You have a list of integers, in random order, that is 20 times larger than the hard drive you have on your work station and 1,000 times larger than your work station ram....
The intent behind the problem in the textbook is fine - think non-linearly about the problem. Just the example used has a trivial solution not mentioned (i.e. option 5).
You're also assuming integer ages when a more natural comparison would have date of birth. Which has 365 times the number of buckets. Something that was again problematic to fit into a 1980s memory.
¯1↑5e6↑{(⊂⍋⍵)⌷⍵}10e6?⍤⍴100
This finds the median of 10 million "ages" in just under 50 milliseconds. Granted, with this randomly generated data it's probably doing something smart to avoid a full 10MB allocation, so on a static dataset the performance might be a bit different.