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

http://www.velocityreviews.com/forums/(E-Mail Removed)d