IntroSort es un algoritmo hibrido (Inserción – Quicksort – Heapsort) de ordenación con comparación pero no estable. Fue desarrollado por David R. Musser en 1.997.
Rendimiento – Complejidad | |||
Mejor caso Ω | Peor caso O | Media Θ | Espacio |
¿>? (n) | (n log n) | (n log n) | (n log n) |
Introsort se articula en función del conjunto de datos.
- Si el número de elementos en la entrada es pequeño, utiliza el método de inserción.
- Utiliza Quicksort en función de la profundidad ( Math.log(Vector.length))/2) que nos indica el nivel de recursividad.
- Se utiliza Heapsort cuando el nivel de profundidad en la 2ª opción no es el conveniente.
Implementación en lenguaje Java.
//ordenaintrasort(Vector, 0, Vector.length, profundidad); profundidad = ((int) Math.log(Vector.length))/2; private static int[] ordenaintrosort(int[] Vector, int menor, int mayor, int profundidad) { if (Vector.length > 100) while (mayor - menor > umbraldecorte) { if (profundidad != 0) { profundidad = profundidad - 1; int eje = Vector[(menor + mayor) / 2]; int posicion = quickDivide(Vector, menor, mayor, eje); ordenaintrosort(Vector, posicion, mayor, profundidad); mayor = posicion; } else { heapsort(Vector, menor, mayor); return Vector; } } else insercion(Vector, menor, mayor); return Vector; } private static int quickDivide(int[] Vector, int menor, int mayor, int eje) { mayor--; while (menor <= mayor) { while (Vector[menor] < eje) {menor++;} while (Vector[mayor] > eje) {mayor--;} if (menor <= mayor) { int intercambio = Vector[menor]; Vector[menor] = Vector[mayor]; Vector[mayor] = intercambio; menor++; mayor--; } } return menor; } private static void heapsort(int[] Vector, int menor, int mayor) { int pmedio = mayor-menor; for (int i = pmedio / 2; i >= 1; i = i - 1) { desciende(Vector, i, pmedio, menor); } for (int i = pmedio; i > 1; i = i - 1) { int intercambio = Vector[menor]; Vector[menor] = Vector[menor + i - 1]; Vector[menor + i - 1] = intercambio; desciende(Vector, 1, i - 1, menor); } } private static void desciende(int[] Vector, int i, int pmedio, int menor) { int temp = Vector[menor + i - 1]; int hijo; while (i <= pmedio / 2) { hijo = i * 2; if (hijo < pmedio && Vector[menor + hijo - 1] < Vector[menor + hijo]) { hijo++; } if (temp >= Vector[menor + hijo - 1]) break; Vector[menor + i - 1] = Vector[menor + hijo - 1]; i = hijo; } Vector[menor + i - 1] = temp; }
Rendimiento.
Estadística individual realizada con el mismo equipo y condiciones del resumen de estadísticas de ordenación.