2012-05-07 4 views
10

Gli algoritmi di ordinamento utilizzati dai vari metodi di ordinamento in NSArray stable? (Come in sono algoritmi di "ordinamento stabile", in cui gli articoli con la stessa chiave di ordinamento conservano gli ordini relativi.)Gli algoritmi di ordinamento utilizzati dagli ordinamenti NSArray stabili?

+1

Ti è fare un tentativo? –

+6

@TDeBailleul "Dare una prova" non è molto utile in questo caso. L'ordinamento potrebbe essere stabile in alcuni casi, ma non in altri, a seconda della dimensione dei dati, della costruzione della matrice, ecc. – omz

+0

Ok, pensavo che il comportamento fosse sempre lo stesso. Buono a sapersi. –

risposta

4

Nel doc, non vengono forniti dettagli sull'ordine finale di articoli identici.

Pertanto, ritengo che fare ipotesi sull'ordine sarebbe una cattiva idea. Anche se si determina sperimentalmente qual è l'ordine, questo potrebbe cambiare in base al numero di elementi nell'array o alla versione di iOS che esegue l'ordinamento.

Per quanto mi riguarda, vorrei attenermi alle promesse fornite dalla documentazione.

+0

Non mi fiderei di esso anche se l'avessi testato a fondo, Apple potrebbe cambiare l'algoritmo usato nella prossima versione, rendendo inutili tutti i test e potrebbe causare alcuni bug strani. – JustSid

+4

La documentazione * fa * specifica, è solo sepolto dietro la documentazione di '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

L'unica risposta "ufficiale" che ho trovato su questo è un 2002 mailing list post da Chris Kane da Apple:

La stabilità dei metodi di ordinamento NSArray/di NSMutableArray è indefinito, così si dovrebbe anticipare che sono instabile. Essendo indefinito, la situazione può anche cambiare da versione a versione, anche se io non rispondo (probabilmente) allo (personalmente). L'attuale implementazione utilizza l'ordinamento rapido, una versione dell'algoritmo quasi identica alla routine qsort() di BS2 . Un po 'di sperimentazione ha trovato ad un certo punto che è stato difficile fare di meglio per i tipi generali di dati che abbiamo durante i test. [Naturalmente, se uno ha ulteriori informazioni sui dati che vengono ordinati, si può usare altri algoritmi o modifiche che contribuiscono a questo caso.]

Non so se questo è ancora vero, visto come vecchio il post è, ma probabilmente è meglio ipotizzare che i metodi di ordinamento di NSArray siano non stabili.

16

L'ordinamento stabile non è garantito se non si utilizza NSSortStable. Dal documentation on NSSortOptions:

NSSortStable

Specifica che i risultati ordinati dovrebbe tornare rispetto oggetti hanno lo stesso valore nell'ordine in cui si sono verificati in origine.

Se questa opzione non è specificata, gli oggetti uguali possono o non possono essere restituiti nell'ordine originale.

Se è necessario garantire una sorta stabile, provare qualcosa di simile:

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

'(void) sortWithOptions: usingComparator:' funziona per gli array mutabili ... c'è anche '(NSArray *) sortedArrayWithOptions: usingComparator:' se questo fa galleggiare la tua barca – wxactly