MQL5Book/Scripts/p3/TemplatesSorting.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

87 lines
2.1 KiB
MQL5

//+------------------------------------------------------------------+
//| TemplateSorting.mq5 |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
template<typename T>
void Swap(T &array[], const int i, const int j)
{
const T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
template<typename T>
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++)
{
if(!(array[i] > array[end]))
{
Swap(array, i, pivot++);
}
}
--pivot;
QuickSort(array, start, pivot - 1);
QuickSort(array, pivot + 1, end);
}
}
struct ABC
{
int x;
ABC()
{
x = rand();
}
bool operator>(const ABC &other) const
{
return x > other.x;
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double numbers[] = {34, 11, -7, 49, 15, -100, 11};
QuickSort(numbers);
ArrayPrint(numbers);
// -100.00000 -7.00000 11.00000 11.00000 15.00000 34.00000 49.00000
string messages[] = {"usd", "eur", "jpy", "gbp", "chf", "cad", "aud", "nzd"};
QuickSort(messages);
ArrayPrint(messages);
// "aud" "cad" "chf" "eur" "gbp" "jpy" "nzd" "usd"
ABC abc[10];
QuickSort(abc);
ArrayPrint(abc);
/* Output example:
[x]
[0] 1210
[1] 2458
[2] 10816
[3] 13148
[4] 15393
[5] 20788
[6] 24225
[7] 29919
[8] 32309
[9] 32589
*/
}
//+------------------------------------------------------------------+