2012-05-07 9 views
10

¿Los algoritmos de clasificación utilizados por los diversos métodos de clasificación en NSArray stable? (Al igual que en los algoritmos de "clasificación estable", donde los elementos con la misma clave de ordenación conservan sus órdenes relativas)¿Los algoritmos de clasificación utilizados por NSArray son estables?

+1

¿Le diste una oportunidad? –

+6

@TDeBailleul "Darle una oportunidad" no es realmente útil en este caso. La clasificación puede ser estable en ciertos casos, pero no en otros, dependiendo del tamaño de los datos, cómo se construyó la matriz, etc. – omz

+0

Ok, pensé que el comportamiento siempre era el mismo. Bueno saber. –

Respuesta

4

En el doc, no se proporcionan detalles sobre el orden final de los artículos idénticos.

Por lo tanto, creo que hacer alguna suposición sobre el orden sería una mala idea. Incluso si determina de manera experimental qué es el pedido, esto podría cambiar en función del número de elementos del conjunto o de qué versión de iOS ejecute el género.

Para mí, me quedaría con las promesas proporcionadas por la documentación.

+0

No me gustaría confiar en que, incluso si lo hubiera probado a fondo, Apple podría cambiar los algoritmos utilizados en la próxima versión, haciendo que las pruebas resulten inútiles y podría ocasionar algunos errores extraños. – JustSid

+4

La documentación * no * especifica, simplemente está oculta detrás de la documentación de 'NSSortOptions': https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference. html # // apple_ref/doc/c_ref/NSSortOptions – wxactly

5

La única respuesta "oficial" que he encontrado sobre este es un 2002 mailing list post por Chris Kane de Apple:

La estabilidad de los métodos de clasificación NSArray/de NSMutableArray no está definido, por lo que deben anticipar que son inestable. Al estar indefinido, la situación también puede cambiar de una versión a otra, aunque no lo hago (yo) anticipo que esto sea probable. La implementación actual utiliza la ordenación rápida, una versión del algoritmo casi idéntica a la rutina qsort() de BSD. Un montón de experimentación encontró en un punto que fue difícil de hacer mejor que la de los tipos generales de datos que hasta en las pruebas. [Por supuesto, si uno tiene información adicional acerca que los datos sean ordenados, se pueden utilizar otros algoritmos o modificaciones que ayudan a ese caso.]

No sé si esto es cierto, dada la edad la publicación es, pero probablemente sea mejor suponer que NSArray métodos de clasificación son no estable.

16

No se garantiza la clasificación estable a menos que use NSSortStable. Desde el documentation on NSSortOptions:

NSSortStable

Especifica que los resultados ordenados debe devolver en comparación artículos tienen igual valor en el orden en que se produjeron originalmente.

Si esta opción no se especifica, los objetos iguales pueden o no ser devueltos en su orden original.

Si necesita garantizar una especie estable, intente algo como:

[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 
+0

'(void) sortWithOptions: usingComparator:' funciona para matrices mutables ... también hay '(NSArray *) sortedArrayWithOptions: usingComparator:' si eso hace flotar su embarcación – wxactly

Cuestiones relacionadas