Ordenar Arrays customizados

 

Bom dia!

Tem como ordenar arrays customizados? O ArraySort() não funciona na minha array de dois informações.

struct ALVOS
   {
      double   Val;
      double   Qtd;
               ALVOS() {
                           Val = 0;
                           Qtd = 0;
                       }
               ~ALVOS(){}
   };

ALVOS AlvosCompra[];

ALVOS AlvosVendas[];

Como ordenar essas duas arrays pela dimensão Val?

Tem função pra isso ou preciso criar uma função que o faça?

Desde já Grato!

 
Juan Pablo Silenzi de Stagni:

Bom dia!

Tem como ordenar arrays customizados? O ArraySort() não funciona na minha array de dois informações.

struct ALVOS
   {
      double   Val;
      double   Qtd;
               ALVOS() {
                           Val = 0;
                           Qtd = 0;
                       }
               ~ALVOS(){}
   };

ALVOS AlvosCompra[];

ALVOS AlvosVendas[];

Como ordenar essas duas arrays pela dimensão Val?

Tem função pra isso ou preciso criar uma função que o faça?

Desde já Grato!


olá Juan!


Você terá que fazer isso manualmente, implementando algum algoritmo de ordenação como Quick Sort, Bubble Sort etc. Você pode pegar um código pronto e adaptar. Aí na comparação você usa o atributo que quer ordenar.


Dá uma olhada nesse artigo, quem sabe te ajuda também!


https://www.mql5.com/pt/articles/3118

Métodos de ordenação e sua visualização usando a MQL5
Métodos de ordenação e sua visualização usando a MQL5
  • www.mql5.com
Na web, você pode encontrar uma série de vídeos que mostram vários tipos de ordenação. Por exemplo, aqui você pode encontrar a visualização de 24 algoritmos de ordenação. Eu tomei esse vídeo como base, juntamente com uma lista de algoritmos de ordenação. A biblioteca Graphic.mqh é responsável por trabalhar com gráficos na MQL5. Ela já foi...
 
Eduardo Fernando Teixeira:


olá Juan!


Você terá que fazer isso manualmente, implementando algum algoritmo de ordenação como Quick Sort, Bubble Sort etc. Você pode pegar um código pronto e adaptar. Aí na comparação você usa o atributo que quer ordenar.


Dá uma olhada nesse artigo, quem sabe te ajuda também!


https://www.mql5.com/pt/articles/3118

Valeu pela ajuda! Dei uma estudada no material que enviou mas não é o caminho que quero e preciso seguir nesse momento, porém pode servir no futuro, muito obrigado. Vou ter que criar uma rotina de ordenação pelo visto! 

 
Juan Pablo Silenzi de Stagni:

Valeu pela ajuda! Dei uma estudada no material que enviou mas não é o caminho que quero e preciso seguir nesse momento, porém pode servir no futuro, muito obrigado. Vou ter que criar uma rotina de ordenação pelo visto! 


Isso, pega o código no stackoverflow, github ou até no wikipedia. Pega a versão em C++ que é a mais parecida com MQL5


boa sorte!

 
Juan Pablo Silenzi de Stagni:

Bom dia!

...

ve se isso te ajuda, precisa passar a strutura, os dados e qual campo quer ordenar.

#define ArraySortStruct(T, ARRAY, FIELD)                                         \
{                                                                                \
  class SORT                                                                     \
  {                                                                              \
  private:                                                                       \
    static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
      const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
    static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
      int Marker = Start;                                                        \
                                                                                 \
      for (int i = Start; i <= End; i++)                                         \
        if (Array[i].##FIELD <= Array[End].##FIELD)                              \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return(Marker - 1);                                                       \
    }                                                                            \
                                                                                 \
    static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
      if (Start < End)                                                           \
      {                                                                          \
        const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1);                                \
        SORT::QuickSort(Array, Pivot + 1, End);                                  \
      }                                                                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
  public:                                                                        \
    static void Sort( T &Array[], int Count = WHOLE_ARRAY, const int Start = 0 ) \
    {                                                                            \
      if (Count == WHOLE_ARRAY)                                                  \
        Count = ::ArraySize(Array);                                              \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1);                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates);
  
  ArrayPrint(Rates);
  
  ArraySortStruct(MqlRates, Rates, open);
  ArrayPrint(Rates);

  ArraySortStruct(MqlRates, Rates, high);
  ArrayPrint(Rates);

  ArraySortStruct(MqlRates, Rates, time);
  ArrayPrint(Rates);
}
 
Jonathan Pereira:

ve se isso te ajuda, precisa passar a strutura, os dados e qual campo quer ordenar.

Cara! Fantastico! Vlw mesmo!

 
Juan Pablo Silenzi de Stagni:

Cara! Fantastico! Vlw mesmo!

Opa,

Espero que tenha ajudado.

 
Jonathan Pereira:


Muito bom ,

já coloquei no meu copycode (includes pessoais).

 
Jonathan Pereira:

ve se isso te ajuda, precisa passar a strutura, os dados e qual campo quer ordenar.

Muito maneiro , codigo limpo,  te falar q sempre fazia com for ... e tinha q ficar repetindo codigo, e usava o metodo bolha, manualmente mesmo,.... essa implementacao do quicksort

ficou fantastica ...mandou muito bem !!!

 
Jonathan Pereira #:

ve se isso te ajuda, precisa passar a strutura, os dados e qual campo quer ordenar.

Perfeito, muito obrigado por disponibilizar.