mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* q s o r t F u n c t i o n
|
||||
* ---------------------------
|
||||
* Copyright 1982 by Digital Research Inc. All rights reserved.
|
||||
*
|
||||
* "qsort" sorts the "number" of items, each of length "size", starting
|
||||
* at "base", using function "compare" to compare 2 items in the vector.
|
||||
*
|
||||
* Calling sequence:
|
||||
* ret = qsort(base,number,size,compar)
|
||||
* Where:
|
||||
* ret = always 0
|
||||
* base -> start of items vector
|
||||
* number = number of elements in vector
|
||||
* size = number of bytes per item in vector
|
||||
* compar -> comparator function, taking ptrs to items,
|
||||
* returning WORD:
|
||||
* compar(a,b) < 0 if *a < *b
|
||||
* compar(a,b) == 0 if *a == *b
|
||||
* compar(a,b) > 0 if *a > *b
|
||||
*
|
||||
* "qsort" uses the quicksort algorithm by C.A.R. Hoare.
|
||||
* Ref: "Software Tools in Pascal" by Kernighan & Plauger.
|
||||
*****************************************************************************/
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#define LINEPOS(nn) ((nn)*siz+bas)
|
||||
#define EXCHANGE(aa,bb) _swap(aa,bb,siz)
|
||||
|
||||
WORD qsort(bas,num,siz,cmp) /* CLEAR FUNCTION ***********/
|
||||
BYTE *bas;
|
||||
WORD num;
|
||||
WORD siz;
|
||||
WORD (*cmp)();
|
||||
{
|
||||
REG WORD i,j;
|
||||
REG BYTE *pivline;
|
||||
|
||||
if( num > 1 )
|
||||
{
|
||||
i = 0;
|
||||
j = num-1;
|
||||
pivline = LINEPOS(j); /* choose last line for pvt */
|
||||
do{
|
||||
while( i<j && (*cmp)(LINEPOS(i),pivline) <= 0 )
|
||||
i++;
|
||||
while( j>i && (*cmp)(LINEPOS(j),pivline) >= 0 )
|
||||
j--;
|
||||
if( i<j ) /* out of order pair */
|
||||
EXCHANGE(LINEPOS(i),LINEPOS(j));
|
||||
}while( i<j );
|
||||
EXCHANGE(LINEPOS(i),pivline);
|
||||
if( i < num-1-i ) /* sort shorter subset 1st */
|
||||
{
|
||||
qsort( bas, i, siz, cmp);
|
||||
qsort( LINEPOS(i+1), num-1-i, siz, cmp);
|
||||
} else
|
||||
{
|
||||
qsort( LINEPOS(i+1), num-1-i, siz, cmp);
|
||||
qsort( bas, i, siz, cmp);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
MLOCAL
|
||||
VOID _swap(a,b,wid)
|
||||
REG BYTE *a;
|
||||
REG BYTE *b;
|
||||
REG WORD wid;
|
||||
{
|
||||
REG BYTE tmp;
|
||||
if( a != b )
|
||||
for( ; wid-- > 0; a++, b++ )
|
||||
{
|
||||
tmp = *a;
|
||||
*a = *b;
|
||||
*b = tmp;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user