[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Minlist, Maxlist (sorting an array)



PureBytes Links

Trading Reference Links

> In spite of the comment saying it's a "very fast" sort routine,
> it's not.

Do you know this from experience or are you merely assuming it based on
a mental image of how you think it works? I haven't done any speed
testing myself but I trust Bob Brickey's testing unless I see some
evidence to the contrary. He's really quite good at this kind of thing.
(understatement :-) 

FWIW, Brickey calls it an exchange sort, not a bubble sort. Scroll to
the bottom to find his speed testing results. The exchange sort is
clearly faster than either a bubble sort or a heap sort, and by a large
margin. Aw, heck, here are the numbers without scrolling down and
reading the whole thing.

Bubble Sort...: 66.13 Seconds
Insertion Sort: 35.53 Seconds
Heap Sort.....: 27.91 Seconds
Shell Sort....: 16.70 Seconds
Quick Sort....: 6.59 Seconds
Exchange Sort.: 4.61 Seconds

-- 
  Dennis

-------------------------------------------------------------------

I found the original post by Bob Brickey describing this algorithm 
with his tests of it. It is appended below. I haven't tested it 
myself.

Bob Fulks

----------------

Resent-Date: Fri, 12 Sep 1997 21:35:25 -0700 (PDT)
To: Omega Mailing List <omega-list@xxxxxxxxxxxxxxx>
Subject: Re: Exchange Sorts
Date: Fri, 12 Sep 97 22:33:56 -0500
From: Scientific Approaches <sci@xxxxxxxxxx>
Resent-From: omega-list@xxxxxxxxxx
X-Mailing-List: <omega-list@xxxxxxxxxx> archive/latest/9585
X-Loop: omega-list@xxxxxxxxxx
Precedence: list
Resent-Sender: omega-list-request@xxxxxxxxxx

Earlier today I wrote:

******************
An exchange sort compares each element, starting with the first, with 
every following element. If any of the following elements is smaller 
than the current element, it is exchanged with the current element 
and the process is repeated for the next element. The sort order can 
be reversed by starting at the other end and working in the opposite 
direction or by exchanging following elements that are larger, rather 
than smaller.

That is all there is to it. It can be implemented with a couple 
nested "for loops" in just a few lines of code. It is very fast. In 
fact, it is many times faster than more complicated methods like 
"insertion sorts" or "bubble sorts" that are widely used.
***********************

Paul Altman sent the following message privately, but I am responding 
to the list in case others misinterpreted the process I tried to 
explain:

Sorry, I must be missing something. This wouldn't work. Let's say you 
wanted to sort a 3-element list comprised of 3,2,1. We want it sorted 
in ascending order. Starting with the first element as a candidate 
for the first exchange, the sort algorithm then looks at the 2nd 
element which has a value of 2. The algorithm sees that it is in fact 
smaller than element 1 (value=3), so it exchanges it.

We now have a list = 2,3,1.

The algorithm "repeats the process for the next element", which would 
result in a list = 2,1,3.

We now approach the 3rd element, and since there are no following 
elements, the algorithm does nothing.

We're now stuck with a list = 2,1,3.

Is it possible I misread this or you left out a word or two?

My explanation could have been more clear, but note I said "An 
exchange sort compares each element, starting with the first, with 
EVERY following element ." Value comparison scans continue through 
list elements to the end of the list on each cycle, rather than 
ending after one comparison, as in your example.

Using your list example, we would start with:

3,2,1

As you correctly stated, the second element is less than the first, 
so the two are exchanged, resulting in:

2,3,1

However, the algorithm does not recycle yet, because the comparison 
scan hasn't included "EVERY following element." The next element to 
the right is 1, which is less than the current comparison element, 
which is 2, so those two elements are exchanged, yielding:

1,3,2

The comparison scan has now reached the end of the list, so the first 
comparison reference pointer moves to the second element, which 
currently is 3. The 2 to its right has a lower value, so those two 
elements are exchanged, resulting in:

1,2,3

which puts the list in ascending order.

I sorted 32,767 randomly ordered FLOATS (seven decimal digit floating 
point numbers) tonight on a Pentium/180 using six different popular 
sort algorithms written in "C". These are the measured sort times of 
each:

Bubble Sort...: 66.13 Seconds
Insertion Sort: 35.53 Seconds
Heap Sort.....: 27.91 Seconds
Shell Sort....: 16.70 Seconds
Quick Sort....: 6.59 Seconds
Exchange Sort.: 4.61 Seconds

As you can see, there are large differences. If you are in a hurry 
and starting with randomly ordered values, an Exchange Sort is the 
one to use.

-Bob Brickey
Scientific Approaches
sci@xxxxxxxxxx