Supongo que la buena función qsort anterior en stdlib no es estable, porque la página man no dice nada al respecto. Esta es la función que estoy hablando:Estabilizando la biblioteca estándar qsort?
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
Asumo que si cambio de función de comparación para incluir también la dirección de lo que estoy comparando, será estable. ¿Es eso correcto?
Ej:
int compareFoos(const void* pA, const void *pB) {
Foo *pFooA = (Foo*) pA;
Foo *pFooB = (Foo*) pB;
if(pFooA->id < pFooB->id) {
return -1;
} else if(pFooA->id > pFooB->id) {
return 1;
} else if(pA < pB) {
return -1;
} else if(pB > pA) {
return 1;
} else {
return 0;
}
}
No entiendo por qué compararía los punteros. Y a qué te refieres con estable (perdona mi ignorancia). Tal vez podrías elaborar en tu pregunta. – jmatthias
Por estable, quiere decir que los ítems a se comparan con el ítem b, y que inicialmente viene antes que b en la matriz, * todavía * viene antes que b en la matriz ordenada. Término del arte en los círculos de clasificación, y la razón del hack de comparar las direcciones. Muy aseado. – dmckee
Muy buena idea, @dmckee, pero lamentablemente no es estable ya que twk está usando las direcciones actuales en lugar de las direcciones de inicio :-) – paxdiablo