Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Facebook !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Bibliothèque

Introsort (tri introspectif) à l'aide de pointeurs de fonction - bibliothèque pour MetaTrader 5

Vues:
109
Note:
(5)
Publié:
MQL5 Freelance Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Tri introspectif

Il s'agit d'une version révisée de la bibliothèque Introsort originale. Désormais,la fonction Introsort() accepte un pointeur de fonction optionnel vers une fonction de comparaison personnalisée.

Le tri Intro ou Introspective est un algorithme de tri hybride qui fournit des performances rapides. Il s'agit d'un algorithme de tri basé sur la comparaison, qui s'articule autour de trois phases. Il utilise le tri rapide ainsi que les algorithmes heapsort et insertion-sort.

Tri rapide
Le tri rapide est un algorithme de division et de conquête qui sélectionne un élément pivot dans le tableau, puis sépare les autres éléments en deux sous-réseaux en vérifiant si les éléments sont plus grands ou plus petits. En moyenne, le tri rapide prend O(nlog(n)) de temps, avec une complexité de O(n2) dans le pire des cas.

Tri en tas
L'algorithme de tri en tas est une méthode de tri basée sur une comparaison binaire en tas. Il s'agit d'un algorithme de tri instable dont la complexité temporelle dans le pire des cas et dans le cas moyen est de O(nlog(n)), et la complexité temporelle dans le meilleur des cas est de O(n).

Tri par insertion
L'algorithme de tri par insertion est une méthode de tri simple qui construit le tableau trié final un élément à la fois. Sa complexité temporelle dans le pire des cas et dans le cas moyen est de O(n2) et dans le meilleur des cas de O(n).

L'algorithme Introsort combine les avantages de ces trois algorithmes. Il commence par un tri rapide, passe à un tri en tas lorsque la profondeur de récursion dépasse un niveau basé sur le nombre d'éléments commencés à être triés et passe à un tri par insertion lorsque le nombre d'éléments est inférieur à une certaine valeur seuil.

  • Si la taille de la partition est telle qu'il est possible de dépasser la limite de profondeur maximale, l'Introsort passe au Heapsort.
  • Si la taille de la partition est trop petite, le tri sélectif passe au tri par insertion.
  • Si la taille de la partition est inférieure à la limite et n'est pas trop petite, il effectue un simple tri sélectif.

L'Introsort se comporte particulièrement bien pendant l'exécution. C'est l'un des algorithmes de tri par comparaison les plus rapides utilisés aujourd'hui, et c'est l'implémentation habituelle de l'algorithme std::sort fourni avec la STL C++, la bibliothèque de classes Microsoft .NET Framework, la bibliothèque GNU Standard C++ et la bibliothèque LLVM libc++.

Références:

//+------------------------------------------------------------------+
//| Introsort|
//+------------------------------------------------------------------+
/**
 * Trier le tableau d'entrée sur place en utilisant la fonction de comparaison less.
 * Vous pouvez spécifier votre propre fonction de comparaison. Si aucune fonction n'est
 * spécifiée, le tri ascendant est utilisé.
 */
template<typename T>
void Introsort(T &arr[]);

//+------------------------------------------------------------------+
//| Introsort en utilisant un pointeur vers la fonction Less() personnalisée.
//| Une fonction Less() personnalisée prend deux arguments et contient de la logique |
//| pour décider de leur ordre relatif dans le tableau trié. L'idée est la suivante : |
//| pour apporter de la flexibilité afin que Introsort() puisse être utilisé pour n'importe quelle |
//| type (y compris les types définis par l'utilisateur tels que les objets ou les structures) |
//| et peut être utilisé pour obtenir n'importe quel ordre de tri souhaité (ascendant, ||).
//| ordre décroissant ou personnalisé des champs de la structure).
//+------------------------------------------------------------------+
template<typename T, typename LessFunc>
void Introsort(T &arr[], LessFunc pfnLess);

Fonction de comparaison Moins :

Vous pouvez spécifier votre propre fonction de comparaison. Si aucune fonction n'est spécifiée, le tri croissant est utilisé. Une fonction Less() personnalisée prend deux arguments et contient une logique permettant de décider de leur ordre relatif dans le tableau trié. L'idée est de fournir une certaine flexibilité afin que Introsort() puisse être utilisée pour n'importe quel type (y compris les types définis par l'utilisateur) et pour obtenir n'importe quel ordre souhaité (croissant, décroissant ou autre). Par exemple, pour trier un tableau d'objets ou de structures (types définis par l'utilisateur) dans un ordre de tri personnalisé :

bool MyLessFunc(const MyStruct &x, const MyStruct &y)
  {
//--- trier par A (ascendant)
   if(x.A < y.A) return(true);
   if(x.A > y.A) return(false);

//--- si égal sur A, trier par B (ascendant)
   if(x.B < y.B) return(true);
   if(x.B > y.B) return(false);

//--- si égal sur B, trier par C (ascendant)
   if(x.C < y.C) return(true);
   if(x.C > y.C) return(false);

//--- toutes les clés sont égales
   return(false);
  }


// Définir un type de pointeur vers la fonction Less personnalisée.
typedef bool (*pLess)(const MyStruct &x, const MyStruct &y);


// Trier un tableau de structures à l'aide d'une fonction Less personnalisée.
Introsort(structArray, (pLess)MyLessFunc);


Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/57233

Angle et vitesse Angle et vitesse

L'indicateur montre l'angle ou la vitesse moyenne de variation des prix.

Bibliothèque de base pour la création de profils de volumes Bibliothèque de base pour la création de profils de volumes

Bibliothèque de base pour créer des profils de volume sur le graphique.

Secondes barres Secondes barres

L'indicateur dessine une deuxième période arbitraire sur le graphique.

Changements de prix Changements de prix

modification des prix des caractères sur un intervalle