forked from rosh/MQL5Book
111 lines
2.9 KiB
MQL5
111 lines
2.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| ArraySort.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
#define PRTS(A) Print(#A, "=", (string)(A) + " / status:" + (string)GetLastError())
| |||
#define LIMIT 10
| |||
#define SUBLIMIT 3
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| ArraySort templated overload to sort 2D array by specific column |
| |||
//+------------------------------------------------------------------+
| |||
template<typename T>
| |||
bool ArraySort(T &array[][], const int column)
| |||
{
| |||
if(!ArrayIsDynamic(array)) return false;
| |||
| |||
if(column == 0)
| |||
{
| |||
return ArraySort(array);
| |||
}
| |||
| |||
const int n = ArrayRange(array, 0);
| |||
const int m = ArrayRange(array, 1);
| |||
| |||
if(column < 0 || column >= m) return false;
| |||
| |||
T temp[][2];
| |||
| |||
ArrayResize(temp, n);
| |||
for(int i = 0; i < n; ++i)
| |||
{
| |||
temp[i][0] = array[i][column];
| |||
temp[i][1] = i;
| |||
}
| |||
| |||
if(!ArraySort(temp)) return false;
| |||
| |||
ArrayResize(array, n * 2);
| |||
for(int i = n; i < n * 2; ++i)
| |||
{
| |||
ArrayCopy(array, array, i * m, (int)(temp[i - n][1] + 0.1) * m, m);
| |||
/* equivalent
| |||
for(int j = 0; j < m; ++j)
| |||
{
| |||
array[i][j] = array[(int)(temp[i - n][1] + 0.1)][j];
| |||
}
| |||
*/
| |||
}
| |||
| |||
return ArrayRemove(array, 0, n);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
// generate random data
| |||
int array[][SUBLIMIT];
| |||
ArrayResize(array, LIMIT);
| |||
for(int i = 0; i < LIMIT; ++i)
| |||
{
| |||
for(int j = 0; j < SUBLIMIT; ++j)
| |||
{
| |||
array[i][j] = rand();
| |||
}
| |||
}
| |||
| |||
Print("Before sort");
| |||
ArrayPrint(array);
| |||
/*
| |||
[,0] [,1] [,2]
| |||
[0,] 8955 2836 20011
| |||
[1,] 2860 6153 25032
| |||
[2,] 16314 4036 20406
| |||
[3,] 30366 10462 19364
| |||
[4,] 27506 5527 21671
| |||
[5,] 4207 7649 28701
| |||
[6,] 4838 638 32392
| |||
[7,] 29158 18824 13536
| |||
[8,] 17869 23835 12323
| |||
[9,] 18079 1310 29114
| |||
*/
| |||
| |||
PRTS(ArraySort(array));
| |||
/*
| |||
ArraySort(array)=true / status:0
| |||
*/
| |||
| |||
// try yourself to sort 2D array by custom column
| |||
// PRTS(ArraySort(array, 0..2));
| |||
| |||
Print("After sort");
| |||
ArrayPrint(array);
| |||
/*
| |||
[,0] [,1] [,2]
| |||
[0,] 2860 6153 25032
| |||
[1,] 4207 7649 28701
| |||
[2,] 4838 638 32392
| |||
[3,] 8955 2836 20011
| |||
[4,] 16314 4036 20406
| |||
[5,] 17869 23835 12323
| |||
[6,] 18079 1310 29114
| |||
[7,] 27506 5527 21671
| |||
[8,] 29158 18824 13536
| |||
[9,] 30366 10462 19364
| |||
*/
| |||
}
| |||
//+------------------------------------------------------------------+
|