7 template <
class TYPE,
class ARG_TYPE,
class ARRAY_TYPE>
8 void QuickSortAsc(comparable_list_base < TYPE, ARG_TYPE, ARRAY_TYPE > & list_base)
10 ::raw_array < POSITION > stackLowerBound;
11 ::raw_array < POSITION > stackUpperBound;
14 POSITION iLPos, iUPos, iMPos;
16 if(list_base.get_size() >= 2)
18 stackLowerBound.push(list_base.get_head_position());
19 stackUpperBound.push(list_base.get_tail_position());
22 iLowerBound = stackLowerBound.pop();
23 iUpperBound = stackUpperBound.pop();
33 if(list_base.get_at(iMPos) < list_base.get_at(iUPos))
34 list_base.get_previous(iUPos);
37 list_base.__swap(iMPos, iUPos);
48 if(list_base.get_at(iLPos) < list_base.get_at(iMPos))
49 list_base.get_next(iLPos);
52 list_base.__swap(iLPos, iMPos);
60 if(list_base.position_index(iLowerBound) < list_base.position_index(iMPos) - 1)
62 stackLowerBound.push(iLowerBound);
63 stackUpperBound.push(iMPos - 1);
65 if(list_base.position_index(iMPos) + 1 < list_base.position_index(iUpperBound))
67 stackLowerBound.push(iMPos + 1);
68 stackUpperBound.push(iUpperBound);
70 if(stackLowerBound.get_size() == 0)
76 template <
class TYPE,
class ARG_TYPE,
class ARRAY_TYPE>
77 void QuickSortDesc(comparable_list_base < TYPE, ARG_TYPE, ARRAY_TYPE > & list_base)
79 ::raw_array < POSITION > stackLowerBound;
80 ::raw_array < POSITION > stackUpperBound;
83 POSITION iLPos, iUPos, iMPos;
85 if(list_base.get_size() >= 2)
87 stackLowerBound.push(list_base.get_head_position());
88 stackUpperBound.push(list_base.get_tail_position());
91 iLowerBound = stackLowerBound.pop();
92 iUpperBound = stackUpperBound.pop();
102 if(list_base.get_at(iUPos) < list_base.get_at(iMPos))
103 list_base.get_previous(iUPos);
106 list_base.__swap(iMPos, iUPos);
117 if(list_base.get_at(iMPos) < list_base.get_at(iLPos))
118 list_base.get_next(iLPos);
121 list_base.__swap(iLPos, iMPos);
129 if(list_base.position_index(iLowerBound) < list_base.position_index(iMPos) - 1)
131 stackLowerBound.push(iLowerBound);
132 stackUpperBound.push(iMPos - 1);
134 if(list_base.position_index(iMPos) + 1 < list_base.position_index(iUpperBound))
136 stackLowerBound.push(iMPos + 1);
137 stackUpperBound.push(iUpperBound);
139 if(stackLowerBound.get_size() == 0)
145 template <
class ARRAY >
146 inline bool sort_find(ARRAY & a,
typename ARRAY::BASE_ARG_TYPE arg,::collection::index & iIndex, ::collection::index iStart, ::collection::index iEnd)
148 if(a.get_size() == 0)
152 ::collection::index iLowerBound = iStart;
153 ::collection::index iMaxBound = iEnd;
154 ::collection::index iUpperBound = iMaxBound;
157 iIndex = (iUpperBound + iLowerBound) / 2;
158 while(iUpperBound - iLowerBound >= 8)
160 iCompare = CompareElements(a.element_at(iIndex),arg);
165 else if(iCompare > 0)
167 iUpperBound = iIndex - 1;
176 iLowerBound = iIndex + 1;
177 if(iLowerBound > iMaxBound)
179 iIndex = iMaxBound + 1;
183 iIndex = (iUpperBound + iLowerBound) / 2;
186 while(iIndex < a.get_count())
188 iCompare = CompareElements(a.element_at(iIndex),arg);
191 else if(iCompare < 0)
196 if(iIndex >= a.get_count())
200 iCompare = CompareElements(a.element_at(iIndex),arg);
203 else if(iCompare > 0)
220#include "collection_key_sort_array.h"
242template <
class TYPE,
class ARG_TYPE,
class ARRAY_TYPE>
248 sort::QuickSortAsc(*
this);
252 sort::QuickSortDesc(*
this);
256template <
class KEY,
class TYPE,
class ARG_TYPE ,
class ARRAY >
257void key_sort_array < KEY, TYPE, ARG_TYPE, ARRAY >::
258SetKeyProperty(KEY (TYPE::* lpfnKeyProperty)())
260 m_lpfnKeyProperty= lpfnKeyProperty;
261 sort::QuickSortByKey < KEY, TYPE, ARG_TYPE >(
Definition comparable_list.h:11