Re: Using Java Classes to Sort a Small Array Quickly
On 8/31/2011 10:48 PM, KevinSimonson wrote:
I have an<enum> named<ProjectEnum> that has twelve values. Today I
added an instance variable to it, a<String> named<collectionTitle>.
The engineer I'm working with asked me to write a static method in
class<ProjectEnum> that returns an array of<ProjectEnum>s sorted
alphabetically by this value<collectionTitle>.
I wrote a little program that compares the performance of
SelectionSort and InsertionSort on comparable arrays of<String>s, and
discovered that InsertionSort sorts in about half the amount of time
that InsertionSort does, at least on our machines. Therefore I
implemented my static method,<alphaSort()>, using InsertionSort.
Failed to find Arrays.sort, did you?
On the way home from work my fellow carpooler told me that there are
Java classes that can do sorts in O(N) time.
Possible, perhaps, for restricted key types and given some
assumptions about the possible values: For instance, it's easy to
sort an array of `boolean' in O(N) time. But quite clearly *not*
possible for sorts based on pairwise comparisons, since log(N!)
grows faster than O(N).
That would be an
improvement, since although InsertionSort is faster than
SelectionSort, it's still an O(N^2) algorithm.
So? N in your case is twelve. There's no point in studying the
behavior "as twelve approaches infinity," becase it doesn't.
Besides, you're misusing O. Suppose I offer you two algorithms,
one whose running time is O(N^2) and the other O(N). Which is faster?
Before you say "O(N), nitwit," let me show you the actual timing
formulae:
T1(N) = N * N (nanoseconds)
T2(N) = N (gigayears)
T1(N) is clearly O(N^2), while T2(N) is O(N). Which do you choose
for sorting N=12 items?
So I went looking, but
all I could find was the<sort()> method from the<Collections>
class.
Either your looking was extremely cursory, or you haven't learned
how to look. I'm not sure how you found Collections.sort, but *if*
you had opened the Javadoc, gone to the "S" index page, and hunted for
the word "sort," you'd have found Arrays.sort right next door to it.
I replaced my code for SelectionSort with a loop that reads
the input array into an<ArrayList< String>> object, calls<sort()> on
the<ArrayList< String>> object, and then reads the values back into
the array; and then ran my test code again. This method was
significantly faster than SelectionSort, but my InsertionSort code
still beat it.
Your improved Javadoc searching skills would have found Arrays.sort,
which might have directed your attention to the Arrays class as a whole
and led you to discover Arrays.asList. Or possibly not, because you
have no need of a List anyhow. Meanwhile you've run "seven times around
the seven hills of Rome," and it's no surprise that the unnecessary trip
has made your task take longer than it needed to.
So I guess my question is,<b><i>is</i></b> there a way in Java to
sort an array of<String>s (or perhaps more to the point to sort an
array of<ProjectEnum>s) that runs in O(N) time? Or even that runs in
O(N^2) time but faster than InsertionSort? I'd appreciate any
information anyone can give me on this.
Probably nothing of O(N); see remarks above. Also probably
nothing as bad as O(N^2), but you can always do the hills of Rome
thing to slow down a better method if you want.
BUT, BUT, BUT! Your N is a constant, a small constant! Even if
your hand-crafted sort runs at ten times the speed of Arrays.sort,
I posit that you have already expended more time than your speedy
method will ever recoup: If Arrays.sort takes a microsecond while
yours takes 100 nanoseconds, and if all your investigation and
implementation (and writing to Usenet) took just ten minutes, you
need more than six hundred billion fast sorts merely to break even.
Modify the arithmetic as needed in light of your actual measurements,
then turn your talents elsewhere instead of wasting them on a non-
problem.
--
Eric Sosman
esosman@ieee-dot-org.invalid