BBS: Inland Empire Archive Date: 02-25-94 (00:08) Number: 228 From: DARYL GREENWOOD Refer#: NONE To: JEFF COCHRAN Recvd: NO Subj: Sort Routines Conf: (2) Quik_Bas
*** Quoting Jeff Cochran to Dik Coates dated 02-19-94 ***
> DC> JC> What is the fastest sort routine in normal QuickBASIC 4.5 for
> sortin
> DC> JC> an array, alphabetic and numeric?
>
> DC> Depends on the data type... If the list is nearly sorted, the
This is part of a routine that I use! I create a
CUSTOMER.DAT file and a CUSTOMER.NDX. I don't sort the DAT
file, just the index file by phone number.
You could create multiple index files to search by other variables in the
CUSTOMER.DAT
Remember this is only the index file, the customer.dat
information is not needed for the example.
*************
TYPE IndexFile
PhoneNo AS STRING * 10
RecNo AS INTEGER ' This is the record number in the CUSTOMER.DAT
END TYPE
DIM I AS IndexFile
C.Phone = "8107910000" ' This is a new phone number to add to my index!
' Load Customer.NDX into memory
REDIM I(1 TO LenOfIndex) AS IndexFile
DEF SEG = VARSEG(I(1)) ' Find where the array
' is located in memory
BLOAD "\ORDER\DATA\CUSTOMER.NDX", VARPTR(I(1)) 'This file has to be
DEF SEG 'created by bsave!
' Locate Position in index file to place new record
' This could be done better!
Numb = 1 ' Numb = Record # to insert before
Count = 1
DO UNTIL Count > LenOfIndex
IF VAL(C.Phone) < VAL(I(Count).PhoneNo) THEN
' I've found the record to insert BEFORE
Numb = Count
EXIT DO
ELSE
' Still looking
Count = Count + 1
END IF
LOOP
' Increase the size of the array by 1
LenOfIndex = LenOfIndex + 1
REDIM PRESERVE I(1 TO LenOfIndex) AS IndexFile
' Add the new Phone and record number to the end of the array
I(LenOfIndex).PhoneNo = C.Phone
I(LenOfIndex).RecNo = RecNo%
IF Count = LenOfIndex THEN
' Dont sort - The new phone number was larger than any other
ELSE
' Bubble Sort - Numb is the record number to insert before
FOR X = LenOfIndex TO Numb + 1 STEP -1
IF X > 1 THEN SWAP I(X), I(X - 1)
NEXT X
END IF
' Save the array
DEF SEG = VARSEG(I(1))
BSAVE "\ORDER\DATA\CUSTOMER.NDX", VARPTR(I(1)), LenOfIndex * LEN(I(1))
DEF SEG
In a 3000 record database it take about 1 second to ADD the
new customer and Sort the Index file!
Daryl Greenwood
$$63
--- 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