SIS
Symmetric Index Structures
|
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