00001
00002
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-- )
00015 {
00016 if( curr->pNext->element < curr->element )
00017 bubSwap(curr->pNext, curr);
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()
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;
00040 DLink* iLink = head;
00041 DLink* jLink = head;
00042 DLink* vLink = head;
00043 DLink* lLink = head;
00044 DLink* rLink = head;
00045
00046 if( right-left > 1 )
00047 {
00048 i = ( left + right ) / 2;
00049
00050
00051 lLink = head;
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 )
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 )
00064 quickSwap( left, right );
00065
00066 if( rLink->element < iLink->element )
00067 quickSwap( i, right );
00068
00069 j = right - 1;
00070 jLink=head;
00071 for( a = 0; a < right - 1; a++ ) { jLink = jLink->pNext; }
00072 quickSwap( i, j );
00073
00074
00075 i = left;
00076 iLink = head;
00077 for( a = 0; a <= left; a++ )
00078 {
00079 if ( i != 0 ) { iLink = iLink->pNext; }
00080 }
00081
00082 vLink = head;
00083 for( a = 0; a < j; a++ ) { vLink = vLink->pNext; }
00084
00085 for(;;)
00086 {
00087
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 );
00110 quickSort( i + 1, right );
00111 }
00112 else
00113 {
00114 for( a = 0; a < left; a++ ) { lLink = lLink->pNext; }
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++ )
00131 {
00132 tempLeft = tempLeft->pNext;
00133 }
00134
00135 for( p = 0; p < right; p++ )
00136 {
00137 tempRight = tempRight->pNext;
00138 }
00139
00140 DLink temp;
00141 temp.element = tempRight->element;
00142 tempRight->element = tempLeft->element;
00143 tempLeft->element = temp.element;
00144 }
00145
00146 #endif