forked from airat77786/MQL5Book
85 lines
3.3 KiB
MQL5
85 lines
3.3 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| ArraySearch.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
#define PRTS(A) Print(#A, "=", (string)(A) + " / status:" + (string)GetLastError())
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Fill array with elements and keep it sorted by ArrayBsearch |
| |||
//+------------------------------------------------------------------+
| |||
void populateSortedArray(const int limit)
| |||
{
| |||
double numbers[]; // the array to fill
| |||
double element[1]; // new value to insert
| |||
| |||
ArrayResize(numbers, 0, limit); // allocate capacity beforehand
| |||
| |||
for(int i = 0; i < limit; ++i)
| |||
{
| |||
// generate a random number
| |||
element[0] = NormalizeDouble(rand() * 1.0 / 32767, 3);
| |||
// find where to place it inside the array
| |||
int cursor = ArrayBsearch(numbers, element[0]);
| |||
if(cursor == -1)
| |||
{
| |||
if(_LastError == 5053) // empty array
| |||
{
| |||
ArrayInsert(numbers, element, 0);
| |||
}
| |||
else break; // error
| |||
}
| |||
else
| |||
if(numbers[cursor] > element[0]) // need to insert at cursor
| |||
{
| |||
ArrayInsert(numbers, element, cursor);
| |||
}
| |||
else // (numbers[cursor] <= value) // need to insert after cursor
| |||
{
| |||
ArrayInsert(numbers, element, cursor + 1);
| |||
}
| |||
}
| |||
ArrayPrint(numbers, 3);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
int array[] = {1, 5, 11, 17, 23, 23, 37};
| |||
// indices 0 1 2 3 4 5 6
| |||
int data[][2] = {{1, 3}, {3, 2}, {5, 10}, {14, 10}, {21, 8}};
| |||
// indices 0 1 2 3 4
| |||
int empty[];
| |||
| |||
PRTS(ArrayBsearch(array, -1)); // 0
| |||
PRTS(ArrayBsearch(array, 11)); // 2
| |||
PRTS(ArrayBsearch(array, 12)); // 2
| |||
PRTS(ArrayBsearch(array, 15)); // 3
| |||
PRTS(ArrayBsearch(array, 23)); // 5
| |||
PRTS(ArrayBsearch(array, 50)); // 6
| |||
| |||
PRTS(ArrayBsearch(data, 7)); // 2
| |||
PRTS(ArrayBsearch(data, 9)); // 2
| |||
PRTS(ArrayBsearch(data, 10)); // 3
| |||
PRTS(ArrayBsearch(data, 11)); // 3
| |||
PRTS(ArrayBsearch(data, 14)); // 3
| |||
| |||
PRTS(ArrayBsearch(empty, 0)); // -1, 5053, ERR_ZEROSIZE_ARRAY
| |||
| |||
populateSortedArray(80);
| |||
/*
| |||
example output (will differ on every run due to randomization)
| |||
[ 0] 0.050 0.065 0.071 0.106 0.119 0.131 0.145 0.148 0.154 0.159
| |||
0.184 0.185 0.200 0.204 0.213 0.216 0.220 0.224 0.236 0.238
| |||
[20] 0.244 0.259 0.267 0.274 0.282 0.293 0.313 0.334 0.346 0.366
| |||
0.386 0.431 0.449 0.461 0.465 0.468 0.520 0.533 0.536 0.541
| |||
[40] 0.597 0.600 0.607 0.612 0.613 0.617 0.621 0.623 0.631 0.634
| |||
0.646 0.658 0.662 0.664 0.670 0.670 0.675 0.686 0.693 0.694
| |||
[60] 0.725 0.739 0.759 0.762 0.768 0.783 0.791 0.791 0.791 0.799
| |||
0.838 0.850 0.854 0.874 0.897 0.912 0.920 0.934 0.944 0.992
| |||
*/
| |||
}
| |||
//+------------------------------------------------------------------+
|