array Modas() = Funcion ContarPresencias(array Numeros() )
array x(0 a numeros.MaxValue) // esto es, exige previamente o bien conocer a priori el valor mayor del array o recorrerlo en un bucle para localizarlo.
// Contar la presencia de cada valor en el array.
Bucle para k desde 0 a Numeros.Length-1
x(numeros(k)) += 1
Fin Bucle
// Buscar la moda o modas que pudiera haber...
Bucle para k desde 0 a x.Length -1
Si x(k) > n luego
n = x(k)
Modas=1
O si x(k) = n luego
Modas +=1
Fin Si
Fin bucle
Redimensionar Array m(0 a Modas -1)
k=0
Hacer Mientras (modas > 0)
Si n= x(k) luego
Modas -=1 //hacemos una cuenta regresiva, para ser más óptimos, nos da igual en que orden aparezcan las modas, ¿no?
m(Modas) = k
Fin si
k +=1
Repetir
Devolver m //el array....
Fin Funcion
La llamada a esta función con el array de valores: 1, 2, 2, 3, 3, 4, 4 devolvería un array con 3 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2
Nota sin embargo que esta solución al usar parcialmente el algoritmo counting, tiene algunas serias limitaciones:
--- solo vale para números, no para cadenas.
--- solo vale para enteros, no para decimales (no es dle todo cierto, pero sería costoso multiplicar todos los números para convertirlos en enteros)
--- si el valor mayor del array es gigante, será costoso en memoria, ya se necesita memoria auxilair del array de contar presencia de cada valor desde 0 hasta el mayor valor hallado en el array. por ejemplo si tienes un array de 5 elementos y sus valores son estos: 5,6,76543210,16,84, exige crear un array de 76543211 elementos...
--- si hay valores negativos, es costoso, exige buscar el valor menor, sumar ese valor a todos, para hacer el menor igual a 0, y al final restar ese valor al consignar los valores en el array 'm'...
Ahora bien, si es algo simple como el ejemplo que has puesto cumple perfectamente tus necesidades...
-----------------------------------------
p.d.: modificado, para indicar la salida que daría la función con tus datos de ejemplo como entrada. OJO: Solo indica los valores de moda, no la frecunecia alcanzada en la moda. Si fuere preciso esto, podría devolverse dicho valor en un índice más (el último en el array)... y los cambios al código serían estos:
Redimensionar Array m(0 a Modas -1)
Redimensionar Array m(0 a Modas)
y...
k = 0
Hacer Mientras (modas > 0)
k = 0
m(Modas) =n
Hacer Mientras (modas > 0)
y finalmente la salida sería entonces:
array con 4 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2 y la cuenta de moda: m(3) = 3