SIS
Symmetric Index Structures
/Users/dbr/ma/src/bas/lml/sort.c
Go to the documentation of this file.
00001 #include "base.h"
00002 
00003 static void Push( void * set, UINT c, SINT (*Cmp)(void *, UINT, UINT), void (*Swap)(void *, UINT, UINT) ){
00004     UINT p;
00005 
00006     while( bTRUE ){
00007         if( c == 0 ){
00008             break;
00009         }
00010         p = (c - 1) / 2;
00011         if( Cmp( set, c, p ) > 0 ){
00012             Swap( set, p, c );
00013             c = p;
00014         }
00015         else{
00016             break;
00017         }
00018     }
00019 }
00020 
00021 static void Sink( void * set, UINT length, SINT (*Cmp)(void *, UINT, UINT), void (*Swap)(void *, UINT, UINT) ){
00022     UINT c, l, r;
00023 
00024     c = 0;
00025     while( bTRUE ){
00026         l = 2*c + 1;
00027         if( l < length ){
00028             r = l + 1;
00029             if( r < length ){
00030                 if( Cmp( set, l, r ) > 0 ){
00031                     if( Cmp( set, l, c ) > 0 ){
00032                         Swap( set, l, c );
00033                         c = l;
00034                     }
00035                     else{
00036                         break;
00037                     }
00038                 }
00039                 else if( Cmp( set, c, r ) < 0 ){
00040                     Swap( set, r, c );
00041                     c = r;
00042                 }
00043                 else{
00044                     break;
00045                 }
00046             }
00047             else if( Cmp( set, l, c ) > 0 ){
00048                 Swap( set, l, c );
00049                 c = l;
00050             }
00051             else{
00052                 break;
00053             }
00054         }
00055         else{
00056             break;
00057         }
00058     }
00059 }
00060 
00061 void Sort( void * set, UINT numberOfElements, SINT (*Cmp)(void *, UINT, UINT), void (*Swap)(void *, UINT, UINT) ){
00062     UINT i;
00063 
00064     for( i = 0; i < numberOfElements; i++ ){
00065         Push( set, i, Cmp, Swap );
00066     }
00067     for( i = 1; i < numberOfElements; i++ ){
00068         Swap( set, 0, numberOfElements-i );
00069         Sink( set, numberOfElements-i, Cmp, Swap );
00070     }
00071 }
00072 
00073 UINT BinarySearch( const void * set, UINT startPos, UINT length, const void * object, SINT (*Cmp)(const void *, UINT, const void *) ){
00074     UINT left, right, mid;
00075     SINT r;
00076 
00077     if( length == 0 ){
00078         return NO;
00079     }
00080     left = startPos;
00081     right = left + length - 1;
00082     while( bTRUE ){
00083         if( left == right ){
00084             if( Cmp( set, left, object ) == 0 ){
00085                 return left;
00086             }
00087             return NO;
00088         }
00089         if( left + 1 == right ){
00090             if( Cmp( set, left, object ) == 0 ){
00091                 return left;
00092             }
00093             if( Cmp( set, right, object ) == 0 ){
00094                 return right;
00095             }
00096             return NO;
00097         }
00098         mid = (left + right)/2;
00099         r = Cmp( set, mid, object );
00100         if( r < 0 ){
00101             left = mid;
00102         }
00103         else if( r > 0 ){
00104             right = mid;
00105         }
00106         else{
00107             return mid;
00108         }
00109     }
00110 }
00111