2010-04-12 11 views
7

si una matriz de tamaño n tiene solo 3 valores 0, 1 y 2 (se repite cualquier cantidad de veces), ¿cuál es la mejor manera de ordenarlos? lo mejor indica complejidad considerar el espacio y el tiempo la complejidad tantosort array de tamaño n

+0

lo que mejor sabe significa en este caso? – EvilTeach

+0

Depende de lo que quiera decir con "mejor", ¿es más conveniente? mas rapido? más eficiente en términos de almacenamiento? más portátil? –

Respuesta

24

Contar las ocurrencias de cada número y luego llenar la matriz con los conteos correctos, esto es O(n)

+0

alias Clasificación de conteo: http://en.wikipedia.org/wiki/Counting_sort –

+0

alias tipo pigeonhole, también conocido como radix sort. – falstro

+0

@ Andreas el valor de n puede ser bastante grande, por lo que contar puede ser un poco problemático en algunos casos –

2

solución al estilo de C no probado:

int count[3] = {0, 0, 0}; 

for (int i = 0; i < n; ++i) 
    ++count[array[i]]; 

int pos = 0; 
for (int c = 0; c < 3; ++c) 
    for (int i = array[c]; i; --i) 
     array[pos++] = c; 
+2

'unsigned' o' size_t' sería más apropiado. – GManNickG

1

Haskell dos forro:

count xs = Map.toList $ Map.fromListWith (+) [ (x, 1) | x <- xs ] 

countingSort xs = concatMap (\(x, n) -> replicate n x) (count xs) 

> countingSort [2,0,2,1,2,2,1,0,2,1] 
[0,0,1,1,1,2,2,2,2,2]