shell sort – array sorting algorithm – library MetaTrader 5

//+------------------------------------------------------------------+
//|                                                    ShellSort.mq5 |
//|                                    2019-2021, dimitri pecheritsa |
//|                                         mql5.com/en/users/dmipec |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| shell sort - array sorting algorithm                             |
//|  cases: best: n log n, average: n^(4/3), worst: n^(3/2)          |
//|  memory: 1, stable: no, method: insertion                        |
//|  note: small code size                                           |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  shellsort, also known as shell sort or shell's method, is an    |
//|in-place comparison sort. it can be seen as either a              |
//|generalization of sorting by exchange (bubble sort) or sorting by |
//|insertion (insertion sort). the method starts by sorting pairs of |
//|elements far apart from each other, then progressively reducing   |
//|the gap between elements to be compared. by starting with far     |
//|apart elements, it can move some out-of-place elements into       |
//|position faster than a simple nearest neighbor exchange. donald   |
//|shell published the first version of this sort in 1959. the       |
//|running time of shellsort is heavily dependent on the gap         |
//|sequence it uses. for many practical variants, determining their  |
//|time complexity remains an open problem.                          |
//|  known complexities range from o(n^2) to o(n^(4/3)) and θ(n      |
//|log^2 n). this, combined with the fact that shellsort is          |
//|in-place, only needs a relatively small amount of code, and does  |
//|not require use of the call stack, makes it is useful in          |
//|situations where memory is at a premium, such as in embedded      |
//|systems and operating system kernels.                             |
//|  shellsort is not stable: it may change the relative order of    |
//|elements with equal values. it is an adaptive sorting algorithm   |
//|in that it executes faster when the input is partially sorted.    |
//|  shellsort performs more operations and has higher cache miss    |
//|ratio than quicksort. however, since it can be implemented using  |
//|little code and does not use the call stack, some implementations |
//|of the qsort function in the c standard library targeted at       |
//|embedded systems use it instead of quicksort. shellsort is, for   |
//|example, used in the uclibc library. for similar reasons, in the  |
//|past, shellsort was used in the linux kernel.                     |
//|  shellsort can also serve as a sub-algorithm of introspective    |
//|sort, to sort short subarrays and to prevent a slowdown when the  |
//|recursion depth exceeds a given limit. this principle is          |
//|employed, for instance, in the bzip2 compressor.                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| script program start function                                    |
//|  a shell sort example. sort terminal symbols by the digits value |
//+------------------------------------------------------------------+
#include <MqhAlgorithmsShellSortShellSort.mqh>
#include <MqhAlgorithmsShellSortFunctions.mqh>
void OnStart(void)
  {
//--- load symbols from the terminal. they will be treated as the 
//items array by the sorter
   string symbols[];
   SymbolsLoad(symbols);
//--- create the keys array which contains the digits values for 
//each symbol from the symbols array, which is the basis for sorting
   int keys[];
   SymbolKeysDigit(symbols,keys);
//--- sort symbols by digits in accending order with the shell sort
//algorithm
   ArraySort(keys,symbols,new CShellSort<int,string>);
//--- check the result of sorting by printing a table of symbols
   SymbolsPrint(symbols);
  }
//--------------------------------------------------------------------
//               symbol |                 color |   digits
//--------------------------------------------------------------------
//          .USTECHCash |               clrPink |        1
//            .DE30Cash |               clrPink |        1
//           .JP225Cash |               clrPink |        1
//            .US30Cash |               clrPink |        1
//           .US500Cash |               clrPink |        1
//                 ATVI |      clrPaleGoldenrod |        2
//                 NVDA |      clrPaleGoldenrod |        2
//                 CSCO |      clrPaleGoldenrod |        2
//                 ORCL |      clrPaleGoldenrod |        2
//                 AMZN |      clrPaleGoldenrod |        2
//                  UPS |      clrPaleGoldenrod |        2
//                 NFLX |      clrPaleGoldenrod |        2
//                 ADBE |      clrPaleGoldenrod |        2
//                 SBUX |      clrPaleGoldenrod |        2
//                 EBAY |      clrPaleGoldenrod |        2
//                 TSLA |      clrPaleGoldenrod |        2
//                  MCD |      clrPaleGoldenrod |        2
//                  DIS |      clrPaleGoldenrod |        2
//                 FOXA |      clrPaleGoldenrod |        2
//                  NEM |      clrPaleGoldenrod |        2
//                  JPM |      clrPaleGoldenrod |        2
//                  BAC |      clrPaleGoldenrod |        2
//                    C |      clrPaleGoldenrod |        2
//                  WFC |      clrPaleGoldenrod |        2
//                    V |      clrPaleGoldenrod |        2
//                   GS |      clrPaleGoldenrod |        2
//                 PYPL |      clrPaleGoldenrod |        2
//                  PRU |      clrPaleGoldenrod |        2
//                BRK.B |      clrPaleGoldenrod |        2
//                 AAPL |      clrPaleGoldenrod |        2
//                   KO |      clrPaleGoldenrod |        2
//                  PEP |      clrPaleGoldenrod |        2
//                   PG |      clrPaleGoldenrod |        2
//                   PM |      clrPaleGoldenrod |        2
//                  NKE |      clrPaleGoldenrod |        2
//                   GM |      clrPaleGoldenrod |        2
//               BTCUSD |  clrMediumSpringGreen |        2
//               ETHUSD |  clrMediumSpringGreen |        2
//                  WMT |      clrPaleGoldenrod |        2
//                  DAL |      clrPaleGoldenrod |        2
//                  XOM |      clrPaleGoldenrod |        2
//                  CVX |      clrPaleGoldenrod |        2
//                BRENT |               clrPink |        2
//                  WTI |               clrPink |        2
//               BTCEUR |  clrMediumSpringGreen |        2
//               DSHUSD |  clrMediumSpringGreen |        2
//               LTCUSD |  clrMediumSpringGreen |        2
//           Crypto.Top |  clrMediumSpringGreen |        2
//           Crypto.ALT |  clrMediumSpringGreen |        2
//                GOOGL |      clrPaleGoldenrod |        2
//                   FB |      clrPaleGoldenrod |        2
//                 MSFT |      clrPaleGoldenrod |        2
//                  IBM |      clrPaleGoldenrod |        2
//                   VZ |      clrPaleGoldenrod |        2
//                 INTC |      clrPaleGoldenrod |        2
//                  HPE |      clrPaleGoldenrod |        2
//                   EA |      clrPaleGoldenrod |        2
//                  MMM |      clrPaleGoldenrod |        2
//               XBTUSD |  clrMediumSpringGreen |        2
//               ETHEUR |  clrMediumSpringGreen |        2
//                   GE |      clrPaleGoldenrod |        2
//                  PFE |      clrPaleGoldenrod |        2
//                  LLY |      clrPaleGoldenrod |        2
//                CMCSA |      clrPaleGoldenrod |        2
//                  JNJ |      clrPaleGoldenrod |        2
//                   BA |      clrPaleGoldenrod |        2
//                  CAT |      clrPaleGoldenrod |        2
//               NLMK.L |               clrGold |        3
//               SGGD.L |               clrGold |        3
//               FIVE.L |               clrGold |        3
//               SBER.L |               clrGold |        3
//               NVTK.L |               clrGold |        3
//               XAUUSD |              clrKhaki |        3
//               AUDJPY |           clrHoneydew |        3
//               CHFJPY |           clrHoneydew |        3
//               ROSN.L |               clrGold |        3
//               PLZL.L |               clrGold |        3
//               EOSUSD |  clrMediumSpringGreen |        3
//               MGNT.L |               clrGold |        3
//               EURJPY |           clrHoneydew |        3
//               LKOD.L |               clrGold |        3
//               NZDJPY |           clrHoneydew |        3
//               MNOD.L |               clrGold |        3
//               ATAD.L |               clrGold |        3
//               OGZD.L |               clrGold |        3
//               USDJPY |           clrHoneydew |        3
//               SVST.L |               clrGold |        3
//               GBPJPY |           clrHoneydew |        3
//               CADJPY |           clrHoneydew |        3
//               USDRUB |           clrHoneydew |        4
//               XRPUSD |  clrMediumSpringGreen |        4
//               EURCHF |           clrHoneydew |        5
//               AUDNZD |           clrHoneydew |        5
//               XAGUSD |              clrKhaki |        5
//               AUDUSD |           clrHoneydew |        5
//               EURGBP |           clrHoneydew |        5
//               GBPAUD |           clrHoneydew |        5
//               EURNZD |           clrHoneydew |        5
//               EURAUD |           clrHoneydew |        5
//               EURPLN |           clrHoneydew |        5
//               GBPUSD |           clrHoneydew |        5
//               GBPCHF |           clrHoneydew |        5
//               NZDCAD |           clrHoneydew |        5
//               NZDCHF |           clrHoneydew |        5
//               EURUSD |           clrHoneydew |        5
//               NZDUSD |           clrHoneydew |        5
//               USDCAD |           clrHoneydew |        5
//               USDCHF |           clrHoneydew |        5
//               GBPNZD |           clrHoneydew |        5
//               USDPLN |           clrHoneydew |        5
//               USDMXN |           clrHoneydew |        5
//               USDZAR |           clrHoneydew |        5
//               EURCAD |           clrHoneydew |        5
//               USDCNH |           clrHoneydew |        5
//               AUDCAD |           clrHoneydew |        5
//               AUDCHF |           clrHoneydew |        5
//               GBXUSD |               clrPlum |        5
//               LTCBTC |  clrMediumSpringGreen |        5
//               ETHBTC |  clrMediumSpringGreen |        5
//               CADCHF |           clrHoneydew |        5
//               GBPCAD |           clrHoneydew |        5
//               USDTRY |           clrHoneydew |        5
//+------------------------------------------------------------------+
    📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks