BBS: Inland Empire Archive Date: 03-28-93 (21:04) Number: 246 From: QUINN TYLER JACKSON Refer#: NONE To: ALL Recvd: NO Subj: Quik_Bas Faq2.1 3/ Conf: (2) Quik_Bas
>>> Continued from previous message But, if you want ALL the variables to be STATIC, use the following method: SUB FooSub () STATIC : : : END SUB There are certain speed advantages to STATIC SUBs and FUNCTIONs, since variables are not created on the stack, but that is a more advanced issue. So, in summary: 1. SHARED allows SUBs and FUNCTIONs to use modular variables, 2. COMMON allows modules to share variables between themselves, 3. STATIC allows variables to retain their value between calls to the SUB or FUNCTION in question. Q2.0 Commonly Requested Routines: Q2.4 Okay, I've looked the whole thing over, Quinn, and I've realized something: the recursive QuickSortXXX routine eats the stack up pretty fast. Is there another way? Is there a way to implement a QuickSort SUB without using recursion? A2.4 Yes, indeed there is. Cornel Huth implemented an iterative quicksort algorithm, which I then tweaked a bit. It is actually a bit faster than the other, and doesn't use too much of the stack. It accomplishes this by using an array to simulate a stack. The modified version follows: S2.0 HUTHSORT.BAS [P210S02.BAS] ' HUTHSORT.BAS written by Cornel Huth ' Iterative QuickSort Routine ' ' Tweaked by Quinn Tyler Jackson SUB subHuthSortSTR (Array() AS STRING) ' ^ TWEAK THESE ^ ' | FOR OTHER TYPES | ' `--+--------------' ' V DIM compare AS STRING TYPE StackType low AS INTEGER hi AS INTEGER END TYPE DIM aStack(1 TO 128) AS StackType StackPtr = 1 aStack(StackPtr).low = LBOUND(Array) aStack(StackPtr).hi = UBOUND(Array) StackPtr = StackPtr + 1 DO StackPtr = StackPtr - 1 low = aStack(StackPtr).low hi = aStack(StackPtr).hi DO i = low j = hi mid = (low + hi) \ 2 compare = Array(mid) DO DO WHILE Array(i) < compare i = i + 1 LOOP DO WHILE Array(j) > compare j = j - 1 LOOP IF i <= j THEN SWAP Array(i), Array(j) i = i + 1 j = j - 1 END IF LOOP WHILE i <= j IF j - low < hi - i THEN IF i < hi THEN aStack(StackPtr).low = i aStack(StackPtr).hi = hi StackPtr = StackPtr + 1 END IF hi = j ELSE IF low < j THEN aStack(StackPtr).low = low aStack(StackPtr).hi = j StackPtr = StackPtr + 1 END IF low = i END IF LOOP WHILE low < hi 'IF StackPtr > maxsp THEN maxsp = StackPtr LOOP WHILE StackPtr <> 1 END SUB =======>8 SAMPLE 2.0 ENDS HERE 8<========= Q2.5 Now that I've got so many neat ways to sort a list, I'd sure like to be able to locate an entry in it quickly. I hear that a binary search is fast, but I just can't figure out how to do that. How do I do a binary search? A2.5 Binary searches are the fastest overall search method for standard sorted lists. Such lists can be divided in two, looked at, and divided again as necessary. A good search method is demonstrated here: S3.0 BISEARCH.BAS [F210S03.BAS] DEFINT A-Z FUNCTION BiSearchSTR (Find AS STRING, Array() AS STRING) Min = LBOUND(Array) 'start at first element Max = UBOUND(Array) 'consider through last DO Try = (Max + Min) \ 2 'start testing in middle IF Array(Try) = Find THEN 'found it! BiSearch = Try 'return matching element EXIT DO 'all done END IF IF Array(Try) > Find THEN 'too high, cut in half Max = Try - 1 ELSE Min = Try + 1 'too low, cut other way END IF LOOP WHILE Max >= Min END FUNCTION =======>8 SAMPLE 3.0 ENDS HERE 8<========= Q3.0 Advanced Topics -- "Hashing in QuickBASIC" >>> Continued to next message * OLX 2.1 TD * Post all questions in this box --> [] --- Maximus 2.01wb * Origin: VKUG/VPCC QuickBasic Echo - Richmond, BC (1:153/151)
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