Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Introsort (Ordenación introspectiva) mediante punteros de función - librería para MetaTrader 5

Visualizaciones:
241
Ranking:
(5)
Publicado:
\MQL5\Scripts\Introsort_FuncPtr\
Introsort.mqh (17.31 KB) ver
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Ordenación Introspectiva

Esta es una versión revisada de la librería Introsort original, ahorala función Introsort() acepta un puntero opcional a una función de comparación personalizada.

Intro o ordenación introspectiva es un algoritmo de ordenación híbrido que proporciona un rendimiento rápido. Es un algoritmo de ordenación por comparación basado en tres fases. Utiliza la ordenación quicksort junto con los algoritmos heapsort e insertion-sort.

Ordenaciónrápida
La ordenación rápida es un algoritmo de divide y vencerás que funciona seleccionando un elemento pivote en la matriz y, a continuación, divide los demás elementos en dos submatrices comprobando si los elementos son mayores o menores. Por término medio, la ordenación rápida alogirthm tarda O(nlog(n)), con una complejidad en el peor de los casos de O(n2).

Heap Sort
Heap sort algoirthm es un método de ordenación basado en comparaciones binarias. Es un algoritmo de ordenación inestable con una complejidad de tiempo en el peor caso y en el caso medio de O(nlog(n)), y una complejidad de tiempo en el mejor caso de O(n).

Ordenación porinserción
El algoritmo de ordenación por inserción es un método de ordenación sencillo que construye la matriz ordenada final de un elemento cada vez. Su complejidad temporal en el peor caso y en el caso medio es O(n2) y en el mejor caso es O(n).

El algoritmo Introsort combina las partes buenas de estos tres algoritmos. Comienza con la ordenación rápida, cambiando a la ordenación heapsort cuando la profundidad de la recursión supera un nivel basado en el número de elementos que comienzan a ordenarse y cambia a la ordenación por inserción cuando el número de elementos es inferior a algún valor umbral.

  • Si el tamaño de la partición es tal que existe la posibilidad de superar el límite máximo de profundidad, Introsort cambia a Heapsort.
  • Si el tamaño de la partición es demasiado pequeño entonces Quicksort cambia a Insertion Sort.
  • Si el tamaño de la partición está por debajo del límite y no es demasiado pequeño, entonces realiza un simple quicksort.

Introsort tiene un comportamiento en tiempo de ejecución particularmente bueno. Es uno de los algoritmos de ordenación por comparación más rápidos que se utilizan en la actualidad, y es la implementación habitual del algoritmo std::sort que se proporciona con la STL de C++, la biblioteca de clases de Microsoft .NET Framework, la biblioteca estándar de C++ de GNU y la biblioteca libc++ de LLVM.

Referencias:

//+------------------------------------------------------------------+
//| Introsort|
//+------------------------------------------------------------------+
/**
 * Ordena el array de entrada in situ usando la función de comparación less.
 * Puede especificar su propia función de comparación. Si no se especifica ninguna función
 *, se utilizará una ordenación ascendente.
 */
template<typename T>
void Introsort(T &arr[]);

//+------------------------------------------------------------------+
//| Introsort usando un puntero a la función personalizada Less(). ||
//| Una función personalizada Less() toma dos argumentos y contiene lógica ||
//| para decidir su orden relativo en el array ordenado. La idea es
//| proporcionar flexibilidad para que Introsort() se pueda utilizar para cualquier |
//| tipo (incluyendo tipos definidos por el usuario como objetos o estructuras) ||
//| y se puede utilizar para obtener cualquier orden de clasificación deseado (ascendente, |
//| orden descendente o personalizado de los campos de la estructura). ||
//+------------------------------------------------------------------+
template<typename T, typename LessFunc>
void Introsort(T &arr[], LessFunc pfnLess);

Función de comparación Menos:

Puede especificar su propia función de comparación. Si no se especifica ninguna función, se utiliza la ordenación ascendente. Una función personalizada Less() toma dos argumentos y contiene lógica para decidir su orden relativo en el array ordenado. La idea es proporcionar flexibilidad para que Introsort() pueda utilizarse para cualquier tipo (incluidos los tipos definidos por el usuario) y pueda utilizarse para obtener cualquier orden deseado (creciente, decreciente o cualquier otro). Por ejemplo, para ordenar una matriz de objetos o estructuras (tipos definidos por el usuario) en un orden personalizado:

bool MyLessFunc(const MyStruct &x, const MyStruct &y)
  {
//--- ordenar por A (ascendente)
   if(x.A < y.A) return(true);
   if(x.A > y.A) return(false);

//--- si igual en A, ordenar por B (ascendente)
   if(x.B < y.B) return(true);
   if(x.B > y.B) return(false);

//--- si igual en B, ordenar por C (ascendente)
   if(x.C < y.C) return(true);
   if(x.C > y.C) return(false);

//--- todas las claves son iguales
   return(false);
  }


// Definir un tipo de puntero a la función personalizada Less.
typedef bool (*pLess)(const MyStruct &x, const MyStruct &y);


// Ordenar array de estructuras usando función Less personalizada.
Introsort(structArray, (pLess)MyLessFunc);


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/57233

Ángulo y velocidad Ángulo y velocidad

El indicador muestra el ángulo o la velocidad media de variación del precio.

Biblioteca básica para crear perfiles de volumen Biblioteca básica para crear perfiles de volumen

Biblioteca básica para crear perfiles de volumen en el gráfico.

Segundos compases Segundos compases

El indicador dibuja un segundo marco temporal arbitrario en el gráfico.

CambiosPrecios CambiosPrecios

cambiar los precios de los caracteres en un intervalo