BBS: Inland Empire Archive Date: 02-24-94 (09:01) Number: 191 From: BRIAN MCLAUGHLIN Refer#: NONE To: JEFF COCHRAN Recvd: NO Subj: Quicksort code Conf: (2) Quik_Bas
Here's Cornel Huth's excellent code for a quicksort (slightly rejiggered by me). You mentioned updating the screen within the sorting loop as a possible source of slowdown...and you may be on to something there. (A screen update every few seconds should be enough for anyone.) If this code doesn't deliver the snap and speed you want, you may need to rethink your whole approach -- maybe use some kind of hashing or indexing on the fly. I am not a database expert and can't help much there. '----------------------- START CODE ---------------------------- DECLARE SUB QuickSort (Lower%, Upper%, Array$()) TYPE QSortStackType 'for QuickSort Low AS INTEGER Hi AS INTEGER END TYPE '========================================= SUB QuickSort (Lower%, Upper%, Array$()) '========================================= 'QuickSort (iterative rather than recursive). 'Public domain code, by Cornel Huth. (Slightly revamped.) 'Lower% and Upper% bound the area to be sorted within Array$. 'To change the array type, change the array specifier in every 'instance of "Array$" and change the variable "Compare$", too. 'To discover just how much of the "stack" array has been used, 'unREM the lines containing references to MaxStackPtr% DIM LStack(1 TO 128) AS QSortStackType 'our "stack" array StackPtr% = 1 'our "stack" pointer 'MaxStackPtr% = StackPtr% LStack(StackPtr%).Low = Lower% LStack(StackPtr%).Hi = Upper% StackPtr% = StackPtr% + 1 'offset the subtraction, below DO StackPtr% = StackPtr% - 1 Low% = LStack(StackPtr%).Low Hi% = LStack(StackPtr%).Hi DO Border1% = Low% Border2% = Hi% Mid% = (Low% + Hi%) \ 2 Compare$ = Array$(Mid%) DO DO WHILE Array$(Border1%) < Compare$ Border1% = Border1% + 1 LOOP DO WHILE Array$(Border2%) > Compare$ Border2% = Border2% - 1 LOOP IF Border1% <= Border2% THEN SWAP Array$(Border1%), Array$(Border2%) Border1% = Border1% + 1 Border2% = Border2% - 1 END IF LOOP WHILE Border1% <= Border2% IF Border2% - Low% < Hi% - Border1% THEN IF Border1% < Hi% THEN LStack(StackPtr%).Low = Border1% LStack(StackPtr%).Hi = Hi% StackPtr% = StackPtr% + 1 END IF Hi% = Border2% ELSE IF Low% < Border2% THEN LStack(StackPtr%).Low = Low% LStack(StackPtr%).Hi = Border2% StackPtr% = StackPtr% + 1 END IF Low% = Border1% END IF 'Perhaps do your screen updates here? LOOP WHILE Low% < Hi% 'IF StackPtr% > MaxStackPtr% THEN MaxStackPtr% = StackPtr% LOOP WHILE StackPtr% <> 1 'PRINT "MAX StackPtr%"; MaxStackPtr% END SUB '-------------------------- END CODE --------------------------- * SLMR 2.1a * Dyslexics of the world, untie! $$62 --- GEcho 1.00+ * Origin: The Disk Box ][ Node 3 (313)790-6828 ZOOM 14.4K (1:2202/11)
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