Cheny:
Un problema me desconcertó cuando leí problema 2.2.10 del capítulo 2 de Algoritmos, 4ª Edición. El libro dice que los resultados del algoritmo de fusión rápida son inestables y no puedo encontrar evidencia de that.Help mí, gracias!
public static void sort(Comparable[] a, int lo, int hi){
if hi <= lo {
return;
}
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid+1, hi);
merge(a, lo, mid, hi);
}
// Why is the result of this sort not stable
private static void merge(Comparable[] a, int lo, int mid, int hi) {
for (int i = lo; i <= mid; i++)
aux[i] = a[i];
for (int j = mid+1; j <= hi; j++)
aux[j] = a[hi-j+mid+1];
int i = lo, j = hi;
for (int k = lo; k <= hi; k++)
if (less(aux[j], aux[i])) a[k] = aux[j--];
else a[k] = aux[i++];
}
No puedo encontrar que los resultados sean inestables, ¿cómo podría llegar a eso?
chqrlie:
Para demostrar la inestabilidad del algoritmo, un solo contraejemplo es suficiente: le permite tener en cuenta las medidas adoptadas para ordenar una matriz de 4 elementos A B C D
que comparan iguales para el less
predicado.
sort(a, 0, 3)
recursivamente en 2 subconjuntos:sort(a, 0, 1)
que recursivamente de nuevosort(a, 0, 0)
que vuelve inmediatamentesort(a, 1, 1)
que vuelve inmediatamentemerge(a, 0, 0, 1)
no cambia el orden deA B
sort(a, 2, 3)
recursivamente en el cualsort(a, 2, 2)
que vuelve inmediatamentesort(a, 3, 3)
que vuelve inmediatamentemerge(a, 2, 2, 3)
no cambia el orden deC D
merge(a, 0, 1, 3)
copia los artículosA B C D
ent
el ordenA B D C
, a continuación, todas las comparaciones en el bucle de combinación se evalúan como falso, por lo tanto, los elementos copiados de nuevo ena
están en el mismo orden, copiado det[i++]
:A B D C
, lo que demuestra la inestabilidad de la algoritmo de clasificación, es decir: el orden relativo de los elementos se compara la igualdad no se conserva.