forked from rosh/MQL5Book
74 lines
2.8 KiB
MQL5
74 lines
2.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| QuickSortStructT.mqh |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Templatized class for quick sorting of anything |
| |||
//+------------------------------------------------------------------+
| |||
template<typename T>
| |||
class QuickSortStructT
| |||
{
| |||
public:
| |||
void Swap(T &array[], const int i, const int j)
| |||
{
| |||
const T temp = array[i];
| |||
array[i] = array[j];
| |||
array[j] = temp;
| |||
}
| |||
| |||
// should override this with operator '>' equivalent
| |||
// applied to any field of struct, object or array column
| |||
virtual bool Compare(const T &a, const T &b) = 0;
| |||
| |||
void QuickSort(T &array[], const int start = 0, int end = INT_MAX)
| |||
{
| |||
if(end == INT_MAX)
| |||
{
| |||
end = start + ArraySize(array) - 1;
| |||
}
| |||
if(start < end)
| |||
{
| |||
int pivot = start;
| |||
| |||
for(int i = start; i <= end; i++)
| |||
{
| |||
// use custom implementation of virtual Compare override
| |||
if(!Compare(array[i], array[end]))
| |||
{
| |||
Swap(array, i, pivot++);
| |||
}
| |||
}
| |||
| |||
--pivot;
| |||
| |||
QuickSort(array, start, pivot - 1);
| |||
QuickSort(array, pivot + 1, end);
| |||
}
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Convenient macro to sort 'A'rray of 'T'ype by 'F'ield |
| |||
//+------------------------------------------------------------------+
| |||
#define SORT_STRUCT(T,A,F) \
| |||
{ \
| |||
class InternalSort : public QuickSortStructT<T> \
| |||
{ \
| |||
virtual bool Compare(const T &a, const T &b) override \
| |||
{ \
| |||
return a.##F > b.##F; \
| |||
} \
| |||
} sort; \
| |||
sort.QuickSort(A); \
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Example of macro usage to sort MqlRates struct by 'high' price |
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
MqlRates rates[];
| |||
CopyRates(_Symbol, _Period, 0, 10000, rates);
| |||
SORT_STRUCT(MqlRates, rates, high);
| |||
*/
|