No has llegado a interpretarme correctamente. Te desgrano cada bucle, porque cometes errores en todos ellos...
Antes de nada te comento el punto final...
no he entendido lo de redimensionar cuenta desde 0 hasta max-min ... java me envia los array Cuenta y ValoresUnicos como null
Redimensionar = dimensionar = inicializar a un tamaño específico.
En java un array se inicializa a un amaño específico así:
NombreArray = new TipoDato[tamaño];Sólo una vez que inicialices el array al tamaño deseado, estos podrán contener algo, si desde el comienzo están vacíos y siguen vaciós, al final también estarán vacíos. Inícialos, y luego ya en los bucles se irán rellenando con los valores adecuados. al iniciarlizarlos, se le da un tamaño al array (que luego puede consukltarse con: array.length) y cada valor del mismo se pone al valor 0.
y no se como devolver el array Valores unicos,
Bueno, esto ya es falta de conocimiento del lenguaje, es algo que pudes consultar perfectamente guglenado, si no tienes un libro a mano, o una web de
referencia del lenguaje Java... No tiene caso preguntar cosas que están escritas en 1.000 partes desde hace 20 años o más... De entrada si no sabes devolverlos, al menos entrégalos por referencia como parámetro en la llamada de la función... de hecho mirando tu función:
- La declaras como void (sin devolución), yo devolvería el valor de 'Unicos'.
- Tienes dos arrays declarados en la entrada de la función: int x[], int y[] ...si el array x contiene los valores entre los que deseamos buscar, qué contiene el array y?... ese array podría ser el array Valoresunicos (da igual el nombre que le pongas, pero siempre mejor si es significativo).
- Supongo que 'n' es el tamaño del array x... puedes usar para el caso x.Length y así no es preciso en la función el parámetro n.
------------------------
------------------------
Empiezo comentando tu código, para señalarte las correccioes que necesita, bucle por bucle:
Cuando recorres el bucle para encontrar el valor menor (del PASO 1) en tú codigo, pones:
for(j=0;j<n;j++)
{
if(y[j]<min)
{
min=y[j];
}
j++;
}
...al mismo tiempo puedes ir hallando el mayor... imagina que tienes esta corta serie de valores: 7,17,3,15,21,2,9 ...al empezar el bucle tomamos como menor y mayor el primero de la serie, el valor 7...
Luego que entramos preguntamos si el siguiente ítem y(1)< min, esto es si 17 es menor que 7, no es menor, luego si no es menor, queda que : o es igual que siete o es mayor, luego, en la alternativa (al si) se pregunta si es mayor que 7 y si es así, asignamos el valor a mayor (si resulta serlo).
En definitiva nos basta un solo bucle para encontrar el menor y
también el mayor de la serie.
Es más, es que no veo que busques el mayor de la serie, creí que lo hacías en otro bucle aparte más adelante..., pero mirando resulta que no, que te has olvidado de ello. Si array(k) es menor que Min luego
Min= array(k)
[b] en otro caso[/b] (lo desmonto en otra línea para que te quede más claro...)
[b]si array(k) es mayor que Max luego
Max = array(k)
fin si[/b]
fin si
Si no buscas el mayor, entonces el valor que usar más adelante para mayor, es que usamos al comienzo, el contenido del indice 0.
De igual modo, aunque de menor importancia, puesto que el primer elemento de la serie ya lo hemos asignado de entrada como el menor y el mayor, el bucle puede ser iniciado desde el siguiente elemtno, es decir el 1 y no volver al cero como haces en: "for(j=0", si hemos asignado ese valor ya, al preguntar 7 no será menor que 7, y 7 tampoco será mayor que 7.... pero bueno, es solo un ítem por el que s epregunta, no tiene más importancia. Tu deberías poner: "for(j=1"
Ahora vamos a repasar el bucle del PASO-2:
for(j=0;j<n;j++)
{
cuenta[y[j-min]]=cuenta[y[j-min]+1];
j++;
}
De entrada el array cuenta, aunque está declarado, no está inicializado, no se le ha asignado un tamaño. En Java, no se permite empezar en otro índice que no sea 0, así que el array debería desde 0 hasta Max-Min. Una vez redimensionado el array (inicializado, quizás te suene
En el código que pones para el segundo paso, no lo has interpretado correctamente ...
Yo puse:
redimensionar cuenta desde 0 hasta max - min
Iniciar bucle para k y recorrer desde 0 hasta fin del array
cuenta(Array(k)-min) = cuenta(Array(k)-min) +1
incrementar k
fin bucle
Fíjate en lo que tu pones: cuenta[y[j-min]]
Y lo que yo te puse: cuenta(Array(k)-min)
Y no me refiero a las llaves y paréntesis (obviamente), si no a donde está el signo '-' y por tanto de qué se hace la resta... es decir
no hacemos resta del índice, sino del valor que contiene ese índice.,... si te fijas, tu tienes 2 cierres de llave al final, yo solo 1, por que el otro cierre, el del índice está tras el índice mismo.
Ahora repaso el código del bucle del PASO-3, hay dos fallos, donde tu tienes:
for(j=min;j<max;j++)
{
if(cuenta[j]>0)
{
unicos=unicos+1;
j++;
}
}
El código es casi correcto, pero contiene 2 fallos:
El primero está en la declaración del bucle, tu has puesto en tu código: for(j=min;j<max;j++)
Y yo puse: Iniciar bucle para K recorriendo desde 0 hasta Max - Min
Luego lo correcto sería poner: for(j=0;j<(max-min);j++)
El otro error lo cometes bucle tras bucle...
Verás cuando yo estructuro un bucle en pseudocódigo:
Iniciar bucle para x desde y hasta z
...
[b] Incrementar X[/b]
fin bucle
El punto de incrementar, es dependiente de qué tipo de bucle se use, si se usa un bucle for... ya lleva en el propio código, como se incrementa. ...en Java igual que en C, (señalado en negrita) es en la forma: for(x=y;x<z;
x++)
Luego no hace falta que al finalizar el bucle vuelvas a incrementar el valor de la variable de control del bucle, porque entonces estás saltando en cada ciclo 2 unidades cada vez.
El 'incrementar x', debe interpretarse que es así, pero si el formato del bucle ya lo ofrece por sí mismo, ya está, no hay que añadirlo. ...pero en bucles de tipo While... no se 'autoincrementa' en el diseño del bucle de forma automática, luego ahí si sería preciso explicitarlo.
En TODOS los bucles for que has puesto, por tanto están sobrando...Por fin te comento el cuarto bucle de tu código, correspondiente al paso 4:
for(j=min;j<max;j++)
{
ValoresUnicos[n]=(j+min);
n++;
if(n==unicos)
{
}
j++;
}
De entrada no has inicializado el array ValoresUnicos (arriba del todo te comentaba si ese array podría ser el mismo que el array 'y', que entra en la función.
Luego la declaración del bucle, tampoco es correcta. Supongo que el error es porque no has trasladado mi declaración al caso de Java. En Java los arrays siempre empiezan en el índice 0, entonces debes hacer el cambio preciso.
Si yo puse esto: Iniciar bucle para K recorriendo desde Min hasta Max
Usando Java deberías poner: for(j=0;j<cuenta.length-1;j++)
el resto del bucle, también está muy desorientado:
Si o puse, en el cuerpo del bucle:
Si cuenta(k) es mayor que 0 luego
ValoresUnicos(n) = (k+min)
Incrementar n
Si n es igual que unicos salir del bucle, ya no hay más...
fin si
tu deberías poner:
if(cuenta[j]>0){
ValoresUnicos[n]=(j+min);
n++;
}
Solo dos cosas más... dado que la variable 'n', tu ya la traes con un valor en la entrada de la función, tienes que hacer una de dos cosas, o bien la pones a 0 antes del bucle, o bien creas una nueva variable que sirva de contador... en cualquier caso, no puedes usar una variable ya existente con un valor que tenga, tal cual... puedes reutilizar una variable muchas veces, pero poniendo a 0 su valor cuando antes de usarlo para otra cosa (a 0 o al valor inicial que debeiera tener, por supuesto).
Finalmente, puedes ignorar la línea: "Si n es igual que unicos salir del bucle", es sólo un ahorro para no recorrer todo el bucle si ya se asignaron todos los valores únicos. No es imprescindible, y probablemente no suponga una mejora en velocidad salvo que a priori se sepa por ejemplo, que hay 1 millón de elementos, pero sólo haya 5 únicos y que estén todos al principio... Este detalle si quieres lo pones en el código, pero lo dejas comentado, cuando tengas más conocimiento del lenguaje y sobreprogamar, lo entenderás claro.
p.d.: Tu último mensaje no lo comento. En este aún con tantos errores tiene mejor enfoque que aquél, que tienes bucles anidados...