Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Eric Sosman Newsgroups: comp.lang.java.programmer Subject: Re: Using Java Classes to Sort a Small Array Quickly Date: Thu, 01 Sep 2011 00:25:04 -0400 Organization: A noiseless patient Spider Lines: 89 Message-ID: References: <86c4a53b-1ca1-48a8-b954-c01bd449278a@s35g2000prm.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Thu, 1 Sep 2011 04:28:15 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="f8igmItKsWs6nM5YanFxAA"; logging-data="26689"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+HcXexLRSfq2Dw/XawZGcV" User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20110812 Thunderbird/6.0 In-Reply-To: <86c4a53b-1ca1-48a8-b954-c01bd449278a@s35g2000prm.googlegroups.com> Cancel-Lock: sha1:OOUlrhCi6a5f+vhK+Pya0Z6NEHc= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:7508 On 8/31/2011 10:48 PM, KevinSimonson wrote: > I have an named that has twelve values. Today I > added an instance variable to it, a named. > The engineer I'm working with asked me to write a static method in > class that returns an array ofs sorted > alphabetically by this value. > > I wrote a little program that compares the performance of > SelectionSort and InsertionSort on comparable arrays ofs, 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,, 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 method from the > 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> object, calls on > the> 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,is there a way in Java to > sort an array ofs (or perhaps more to the point to sort an > array ofs) 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