Re: Sort Speed

 BBS: Inland Empire Archive
Date: 05-07-92 (01:24)             Number: 170
From: MIKE AVERY                   Refer#: NONE
  To: MILES HUFFORD                 Recvd: NO  
Subj: Re: Sort Speed                 Conf: (2) Quik_Bas
MA>> In general, a Shell sort is much faster than a bubble sort, however
MA>> when a "nearly sorted" or "completely sorted" list is sorted, a
MA>> bubble sort will blow the doors off of just about any other sort as
MA>> it _should_ only make one pass over the data.

MA>> Which sort is "the best" is often a matter of understanding how it
MA>> will be used - if the data will often be nearly or completely sorted,
MA>> a bubble sort may be a good choice.  If you are writing the sort, it
MA>> may be a good idea to make a single pass over the data, check how out
MA>> of sorts it it is and then select the sort based on the first scans
MA>> results.

 MH> A bubble sort tends to make too many swaps..  It swaps the same
 MH> item many times,  I tried the bubble sort on a completly sorted
 MH> array and then used the shell sort...again...the shell sort was
 MH> much faster. Its because the bubble sort makes many more loops
 MH> than the shell sort.

A bubble sort will only swap data if the data is out of order.  And it
should only make 1 pass over data that is already sorted.  As a result, if
the data is already sorted no swaps and only 1 pass.  The bubble sort code
in the MicroSoft sort demo included with QuickBasic does this.  In case
you only have the QBASIC provided with DOS 5.0, I have included a bubble
sort I wrote modelled after the Microsoft bubble sort.

Again, if the data is not in sorted or nearly sorted order, the bubble
sort stinks.

SUB BubbleSort (WorkSpace$, StartSort%, EndSort%)
' Do a bubble sort in the workspace, sorting the items from StartSort%
' to EndSort%.

Limit% = EndSort%

DO
   Switch% = 0
   FOR I% = StartSort% TO Limit% - 1
       IF Work%(I%) > Work%(I% + 1) THEN 'if data out of order
   CALL Swapper(I%, I% + 1)       'swap it
   Switch% = I%                   'point to last swap done
       END IF
   NEXT I%
   ' sort only to the point where the last switch was made...
   Limit% = Switch%
LOOP WHILE Switch% > StartSort%          'and sort until no swaps are done

END SUB

A LOT of code has been removed as it dealt with profiling the sort and is
not relevant to the discussion at hand.  Hopefully I have not removed
anything important.  The Swapper routine swaps the elements in Work% that
the arguments point to.  The routine was put in place as part of profiling
the sort.  In short, it counts the number of swaps.  Also, it displays the
data on screen so as to amuse people interested in sorts.  Since I am
comparing about 17 various sorts, it made sense to use a routine to swap
and count.  Less debugging and all that.  The comments to the right of
each line were added as I edited this message.  I mention this so if the
syntax is wrong, people won't feel that the code was never run under QB45.

A final note - here are the results from a recent sort test on pre-sorted
data, nearly sorted, and unsorted data.  The sorts were run in the
environment, on a 386DX-25 no-name clone slowed down to 8mhz so that there
would be a difference between some of the sorts.  (It ran a LOT slower on
my old XT!!!!)  The nearly sorted data has about 10% of the data items out
of order, with data needing to be moved throughout the data array.  There
are 368 data items to be sorted.


                                  Sort Demo
                            Using Pre-Sorted Data
 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
 ³                                                                          º
 ³       Sort Name          Sort Results                                    º
 ³                          Compares     Exchanges    Elapsed Time          º
 ³          Bubble               367             0               0          º
 ³        Exchange            67,528             0              43          º
 ³      Hybrid q-e             9,126            18               7          º
 ³       Insertion               367           367               1          º
 ³           Quick             2,929           372              14          º
 ³           Radix             3,307             0               5          º
 ³           Shell             1,661             0               1          º
 ³         baTcher             6,463             0              22          º
 ³            heAp            13,272         5,602              35          º
 ³          shaKer               367             0               0          º
 ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ

                                  Sort Demo
                           Using Nearly Sorted Data
 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
 ³                                                                          º
 ³       Sort Name          Sort Results                                    º
 ³                          Compares     Exchanges    Elapsed Time          º
 ³          Bubble            67,162         6,240              75          º
 ³        Exchange            67,528           363              45          º
 ³      Hybrid q-e            20,902           472              17          º
 ³       Insertion             6,607         6,607              22          º
 ³           Quick            15,309           790              25          º
 ³           Radix             3,301           576               8          º
 ³           Shell             5,353           777               7          º
 ³         baTcher             6,463           620              25          º
 ³            heAp            13,694         5,556              35          º
 ³          shaKer            12,045         6,240              39          º
 ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ

                                 Sort Demo
                             Using Unsorted Data
 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
 ³                                                                          º
 ³       Sort Name          Sort Results                                    º
 ³                          Compares     Exchanges    Elapsed Time          º
 ³          Bubble            66,556        33,742             212          º
 ³        Exchange            67,528           364              45          º
 ³      Hybrid q-e            38,504           588              29          º
 ³       Insertion            34,104        34,109             115          º
 ³           Quick            34,755           891              38          º
 ³           Radix             3,307           774               9          º
 ³           Shell            11,518         2,408              20          º
 ³         baTcher             6,463         1,992              33          º
 ³            heAp            11,589         3,414              24          º
 ³          shaKer            45,545        33,742             198          º
 ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ

Hope this answers some questions for you,
Mike

--- via Silver Xpress V3.00
 * Origin: Silver Xpress Mail System (1:382/10@fidonet)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET