Consultor Eletrônico



Kbase P69997: Quick Sort algorithm for a comma delimited list.
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   02/03/2004
Status: Unverified

GOAL:

Quick Sort algorithm for a comma delimited list.

FACT(s) (Environment):

Progress 8.x

FACT(s) (Environment):

Progress 9.x

FIX:

This is a generic implementation of C.A.R Hoare's Quick Sort algorithm.
Te following sample will take a comma delimited list stored into a CHARACTER variable and returns the list in ASCENDING or DESCENDING order.

DEF VAR c1 AS CHARACTER.

c1 = "01730,Oak,Bedford,MA,US,14,Progress,DLC,91C,100A".

RUN quicksort( INPUT-OUTPUT c1, 1, NUM-ENTRIES( c1 ), TRUE ).

MESSAGE c1 VIEW-AS ALERT-BOX.

PROCEDURE quicksort :

DEFINE INPUT-OUTPUT PARAM cString AS CHARACTER.
DEF INPUT PARAM lo0 AS INTEGER.
DEF INPUT PARAM hi0 AS INTEGER.
DEF INPUT PARAM oasc AS LOGICAL.

DEF VAR ctmp AS CHARACTER.
DEF VAR imid AS INTEGER.
DEF VAR hi AS INT.
DEF VAR lo AS INT.

hi = hi0.
lo = lo0.
imid = TRUNCATE( ( hi0 + lo0 ) / 2, 0 ).

DO WHILE( lo <= hi ):
DO WHILE( lo < hi0 AND
( ( oasc AND ENTRY( lo, cString ) < ENTRY( imid, cString ) )
OR ( NOT oasc AND ENTRY( lo, cString ) > ENTRY( imid, cString ) )
)
) :
lo = lo + 1.
END.
DO WHILE( hi > lo0 AND
( ( oasc AND ENTRY( hi, cString ) > ENTRY( imid, cString ) )
OR ( NOT oasc AND ENTRY( hi, cString ) < ENTRY( imid, cString ) )
)
):
hi = hi - 1.
END.

IF( lo <= hi ) THEN DO:
ctmp = ENTRY( lo, cString ).
ENTRY( lo, cString ) = ENTRY( hi, cString ).
ENTRY( hi, cString ) = ctmp.
lo = lo + 1.
hi = hi - 1.
END.
END.

IF( lo0 < hi ) THEN
RUN quicksort( INPUT-OUTPUT cString, lo0, hi, oasc ).

IF( lo < hi0 ) THEN
RUN quicksort( INPUT-OUTPUT cString, lo, hi0, oasc ).

END PROCEDURE.