I'm trying to write an algorithm which can print the k smallest numbers in an n-size-array in O(n) time, but I cannot reduce the time complexity to n. How can I do this?
I've done this in an interview before, and one of the most elegant/efficient ways to do this is
O(n log k).
with space: O(k) (thanks, @Nzbuu)
Basically you're going to use a max-heap of size limited to k. For each item in the array, check to see if it's smaller than the max (only O(1)). If it is, remove the max and put that in the heap (O(log k)). If its bigger, go to the next item.
Of course, the heap doesn't yield a sorted list of k items, but that can be done in O(k log k) which is easy.
Similarly, you can do the same for finding the largest k items, in which case you would use a min-heap.