Atle Borsholm recently posted a clever solution for finding the n-th smallest element in an array on the IDL Data Point. He compares this to a naive solution which simply sorts all the elements and grabs the n-th element:
IDL> tic & x = ordinal_1(a, 123456) & toc % Time elapsed: 3.0336552 seconds.
His solution performs much better:
IDL> tic & x = ordinal_2(a, 123456) & toc % Time elapsed: 0.46286297 seconds.
IDL> tic & x = mg_n_smallest(a, 123456) & toc % Time elapsed: 0.18394303 seconds.
MG_N_SMALLEST does not return the n-th smallest element directly, but returns indices to the smallest
I have a more detailed description of what
MG_N_SMALLEST is doing in an older article. I like this routine as a good example of using
HISTOGRAM and its
REVERSE_INDICES keyword. It also a nice example of when using a
FOR loop in IDL isn’t so bad.
I include even more detail on this routine in the “Performance” chapter of my book.