13 template <
typename F1,
typename F2,
typename A1,
typename A2 >
14 void quick_sort_compare_swap(
15 ::collection::index iSize,
17 const F1 & comparefunctiona,
19 const F2 & swapfunctiona,
21 const A1 & comparearga,
26 index_array stackLowerBound;
27 index_array stackUpperBound;
28 ::collection::index iLowerBound;
29 ::collection::index iUpperBound;
30 ::collection::index iLPos, iUPos, iMPos;
33 ::std::strong_ordering iCompare(::std::strong_ordering::equal);
38 stackLowerBound.push(0);
39 stackUpperBound.push(iSize - 1);
44 iLowerBound = stackLowerBound.pop();
45 iUpperBound = stackUpperBound.pop();
56 for (::i32 i = 0; i < comparefunctiona.get_size(); i++)
58 auto iCompare = comparefunctiona[i](comparearga[i], iMPos, iUPos);
64 else if (iCompare < 0)
74 for (::i32 i = 0; i < swapfunctiona.get_size(); i++)
76 swapfunctiona[i](swaparga[i], iMPos, iUPos);
89 for (::i32 i = 0; i < comparefunctiona.get_size(); i++)
91 iCompare = comparefunctiona[i](comparearga[i], iLPos, iMPos);
97 else if (iCompare < 0)
107 for (::i32 i = 0; i < swapfunctiona.get_size(); i++)
109 swapfunctiona[i](swaparga[i], iLPos, iMPos);
118 if (iLowerBound < iMPos - 1)
120 stackLowerBound.push(iLowerBound);
121 stackUpperBound.push(iMPos - 1);
123 if (iMPos + 1 < iUpperBound)
125 stackLowerBound.push(iMPos + 1);
126 stackUpperBound.push(iUpperBound);
128 if (stackLowerBound.get_size() == 0)