Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/DataType/Link/dlistsort.cpp

Go to the documentation of this file.
00001 // Contribution to J2K library by David
00002 // Reviewed by Fred P.
00003 
00004 #ifndef __J2K__STORAGE__DLIST_SORT_CPP__
00005 #define __J2K__STORAGE__DLIST_SORT_CPP__
00006 
00007 #include <j2k/DataType/Link/DList.hpp>
00008 
00009 void DList::bubSort()
00010 {
00011   for(int i=0;i < nbElements;i++)
00012   {
00013     curr = head;
00014     for( register int j = nbElements; j > i; j-- )  // iterate thru list, compare
00015     {                                                // each adjacent pair of elements
00016       if( curr->pNext->element < curr->element )    // swap elements if they are not 
00017         bubSwap(curr->pNext, curr);                 // in the correct relation
00018       curr = curr->pNext;
00019     }
00020   }
00021 }
00022 
00023 void DList::bubSwap( DLink* d1, DLink* d2 )
00024 {
00025   DLink temp;
00026   temp.element = d1->element;
00027   d1->element = d2->element;
00028   d2->element = temp.element;
00029 }
00030 
00031 void DList::Sort()                                  // will call quicksort() initially
00032 {
00033   if ( nbElements <= 1 ) return;
00034   quickSort(0,nbElements);
00035 }
00036 
00037 void DList::quickSort( int left, int right )
00038 {
00039     register int i, j, a;                             // i,j are indexes to linked list   
00040     DLink* iLink = head;                              // iLink,jLink correspond i & j index 
00041     DLink* jLink = head;                              // vLink will determine how sublists 
00042     DLink* vLink = head;                              // are resized 
00043     DLink* lLink = head;
00044     DLink* rLink = head;                              // rLink,lLink refer to "new" head and 
00045                                                       // tail of sublist  
00046     if( right-left > 1 )                              // More than 2 elements
00047     {
00048         i = ( left + right ) / 2;                     // get pivot value
00049 
00050         // Find first element larger than pivot and last element not larger than pivot
00051         lLink = head;                                 // start at beginning,use index
00052         for( a = 0; a < left; a++ )  { lLink = lLink->pNext; }
00053 
00054         iLink = head;
00055         for( a = 0; a < i; a++ ) { iLink = iLink->pNext; }
00056       
00057         if ( iLink->element < lLink->element )        // compare and flip  
00058         quickSwap( i, left );
00059       
00060         rLink = head;
00061         for( a = 0; a < right; a++ ) { rLink = rLink->pNext; }
00062               
00063         if( rLink->element < lLink->element )         // compare and flip
00064         quickSwap( left, right );
00065       
00066         if( rLink->element < iLink->element )
00067         quickSwap( i, right );
00068             
00069         j = right - 1;                                // index of left,j in linked list,
00070         jLink=head;                                   // indicates first sublist
00071         for( a = 0; a < right - 1; a++ )  { jLink = jLink->pNext; }
00072         quickSwap( i, j );
00073 
00074         // index of i,right in linked list, contains second sublist
00075         i = left;
00076         iLink = head;
00077         for( a = 0; a <= left; a++ )
00078         {
00079           if ( i != 0 ) { iLink = iLink->pNext; }    // No need to do this for 1st element 
00080         }
00081       
00082         vLink = head;
00083         for( a = 0; a < j; a++ ) { vLink = vLink->pNext; }
00084 
00085         for(;;)
00086         {
00087             // check which sublist vLink->element belongs and adjust sublist
00088             iLink = iLink->pNext;
00089             i++;
00090             while( iLink->element < vLink->element)
00091             {
00092               iLink = iLink->pNext;
00093               i++;  
00094             }
00095         
00096             jLink = jLink->pPrev;
00097             j--;
00098 
00099             while( vLink->element < jLink->element )
00100             { 
00101               jLink = jLink->pPrev;
00102               j--;
00103             }
00104         
00105             if( j < i ) break;
00106             quickSwap( i, j );
00107         }
00108         quickSwap( i, right - 1 );
00109         quickSort( left, j );           // recursively sort each sublist
00110         quickSort( i + 1, right );
00111     } 
00112     else 
00113     {
00114       for( a = 0; a < left;  a++ ) { lLink = lLink->pNext; } // only 2 elements so check and flip
00115       for( a = 0; a < right; a++ ) { rLink = rLink->pNext; }
00116       if ( rLink->element < lLink->element )
00117       {
00118         quickSwap( left, right );
00119       }
00120     }
00121 }
00122 
00123 /////////////////////////////////////////////////////////////////
00124 void DList::quickSwap( int left, int right )
00125 {
00126   DLink* tempLeft  = head;
00127   DLink* tempRight = head;
00128 
00129   register int p = 0;
00130   for( p = 0; p < left; p++ )        // get left variable   
00131   {
00132     tempLeft = tempLeft->pNext;
00133   }
00134 
00135   for( p = 0; p < right; p++ )       // get right variable  
00136   {
00137     tempRight = tempRight->pNext;
00138   }
00139   
00140   DLink temp;
00141   temp.element       = tempRight->element;
00142   tempRight->element = tempLeft->element;        // flip
00143   tempLeft->element  = temp.element;
00144 }
00145 
00146 #endif

Generated on Sun Oct 14 18:46:18 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001