Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda sencilla sobre arrays.

Hola a tod@s,
estoy con los algoritmos de ordenación....y me surge una duda....a la vez de un problema...cuando creo un vector de tipo int...java inicializa todos sus valores a 0...entonces...si quieres insertar un elemento mediante el algortimo de insercion...mira si ese elemento del vector es menor que el elemento a insertar...si quiero insertar un 7....como no es menor que ninguno de los elementos iniciales del vector (porque java los inicializa a 0), no me lo insertará en ninguna posición....
Alguien me puede resolver esta duda....
Gracias...y disculpad a aquellos que pensarán...esto ya se ha resueltoooo...abstenerse por favor comentarios que no me ayuden...solo quiero resolver mis dudas y buen rollo..yo no he encontrado la respuesta.
Saludos.

enero 27, 2013 | Unregistered Commentershao

No entiendo el problema.
Para ordenar un array, debe estar inicializado con los datos que se quieren ordenar. Por eso no entiendo qué tiene que ver la inicialización por defecto de un array de enteros, con la ordenación de su contenido, una vez que ya tiene los datos que interesa ordenar.

enero 28, 2013 | Registered Commenterchoces

Estoy con el algoritmo de ordenación directa....cada vez que insertas un dato miras en qué posición lo pones...entonces...si todos los datos están a 0 (java un array de enteros te lo inicializa todos sus valores a 0)...si quiero poner un 7...ninguno será mayor que 7...con lo cual recorrerá todas las posiciones sin encontrar una posición para ese 7...
Lo he probado y no me inserta el valor...
En cambio si es un array de clase...es decir...static...inicializa los valores a infinito..pero si no es static los inicializa a 0...con lo cual este algoritmo...no funcionaria...
Es decir..mi idea es insertar los valores cada vez que leo uno...ponerlo ya en la posición adecuada y así cada vez que pido uno...
me entendéis???
Saludos.

enero 28, 2013 | Unregistered Commentershao

hola @shao vamos a ver si entiendo, tu lo que quieres es que tu programa inserte los elementos en la posicion correcta para no desordenar el array correcto?., bueno como dices que estas usando un vector no dinamico, inevitablemente vas a tener que remplazar los valores de las casillas, dado que es de tamaño fijo la solucion es suponiendo que ordenas ascedente, es eliminar el elemento más pequeño para hacerle espacio al nuevo ejemplos:

digamos que tu array es de tamaño 4:
al inicio
0,0,0,0
quieres insertar el 7
entonces comparas si llegas al final del vector entonces inserta al final
0,0,0,7
insertemos un 8
comparas otra ves sucede lo mismo, llegas al final del vector entonces insertas el 8 al final
pero antes eliminas el más pequeño que consiste en correr los elementos
asi
0,0,7,0 ahora si insertas el 8
0,0,7,8
ahora insertas un 5
comparas como 5 es menor que 7 y mayor que 8 queda en la casilla 2 (1 contando desde 0), en tu algoritmo otra ves llamas a eliminar en este caso queda igual e insertas el valor.
y quedaria 0,5,7,8
ahora insertamos 6
va quedara otra ves en la casilla 2 aplicas eliminar que deberia quedar asi 5,0,7,8
5,6,7,8

la base de tu algoritmo es eliminar que lo que hace es correr tus valores desde un punto indicado hasta el inicio del vector. como en los ejemplos, ahorita ando algo corto de tiempo
si no te pusiera codigo, dime si te sirvio mi idea, o si encontraste otra solucion, cuando tenga un cacho de tiempo te pego un poco de codigo.

saludos

enero 28, 2013 | Registered Commenterjhosep

Si me sirvió jhosep...es lo que había pensado...pero imagínate que me introducen un 0?????lo metería donde tocase...pero luego si inserto un elemento distinto de 0 y no hay sitio...eliminaría ese cero que realmente está bien...no se si me explico....
es decir...no me gusta que java inicialice los valores del vector a 0....ya que el algoritmo de ordenación...no funcionaría....o es que algo estoy viendo mal.
Gracias.
Saludos.

enero 28, 2013 | Unregistered Commentershao

quería decir algoritmo de ordenación por inserción...

enero 28, 2013 | Unregistered Commentershao

El algoritmo de ordenación por inserción es diferente a lo que explicas que estás haciendo:

http://es.wikipedia.org/wiki/Ordenamiento_por_inserci%C3%B3n#Java

Se parte de un array con los elementos desordenados, que se ordenan según este algoritmo concreto.

Otra cuestión muy diferente, que es lo que planteas desde el principio, es insertar en un array inicializado a cero, elementos en un orden determinado.
Es un procedimiento muy complejo, en el que además hay que tener en cuenta que los elementos a insertar pueden ser positivos, negativos o cero.
Lo más natural es llenar el array con los elementos que uno quiere, y ordenarlos después.

enero 28, 2013 | Registered Commenterchoces

En un libro que tengo..lo hace como yo digo...así explica dicho algoritmo...el vector está vacío y conforme lee datos va insertándolos...no tiene sentido un vector ya con datos desordenados...insertar nuevos...habría que ir eliminando elementos...en el libro lo hace con un vector vacío...supongo que supondrá que el vector está inicializado a infinito como dice que se inicializan los arrays que son estáticos a una clase...
¿cómo puedo dar un valor infinito a un elemento de un array?

enero 28, 2013 | Unregistered Commentershao

Según la wikipedia...coincide con lo que digo...copio y pego:
"Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado."
es decir..parte con un elemento...los demás estarán a 0....porque así lo inicializa java...entonces así no funciona...

enero 28, 2013 | Unregistered Commentershao

Ese libro está dando una mala explicación de lo que es el Algoritmo de Ordenación por Inserción.
Los arrays en Java no se inicializan "a infinito"; al contrario, tienen un tamaño claramente definido en su declaración. El uso de static no tiene nada que ver con el tema en cuestión.
¿Dar un valor infinito a un elemento de un array?.

// campos de una clase
private final int[] enteros1 = {0,3,5,7,9};
private final int[] enteros2 = new int[5];

// variables en un método
final int[] enteros3 = new int[]{6,8,2,3,5};
final int[] enteros4 = new int[5];

Otra cuestión son las colecciones, que no tienen un tamaño predeterminado, como las List<E>

Todos los algoritmos de ordenación, tanto para arrays como para colecciones, parten de que unos u otras contengan datos que se quieren ordenar.
En Java, para arrays se tiene Arrays.sort y para las colecciones Collections.sort como métodos del JDK para ambos casos. Y ambos usan los algoritmos más eficientes.

enero 28, 2013 | Registered Commenterchoces

Esa versión en castellano de Wikipedia se explica mal, o está mal traducida:

http://en.wikipedia.org/wiki/Insertion_sort

Aparte de que ni las implementaciones del algoritmo, ni la explicación detallada de cómo funciona, dice nada, ni remotamente parecido, a lo que indicas.

enero 28, 2013 | Registered Commenterchoces

Parece que me he explicado mal...
cuando he dicho infinito..no me refería al tamaño...sino al valor que le da inicialmente a un array, la inicialización...
Ejemplo: int v[] = new int[7]; ¿qué valor tiene v[0]?
Pues según este libro...si es un array perteneciente a la clase...es decir...static, contendrá el valor infinito.
Si es un array de un método...contendrá el valor 0.
Lo he comprobado mediante un programa sencillo...y los dos dan el valor 0.
Mi duda...se le puede dar un valor infinito a un número entero??
Saludos.

enero 28, 2013 | Unregistered Commentershao

La inicialización de un campo array static no es diferente de la del que no es static. Eso no tiene nada que ver con la inicialización.
Creo que, o bien ese libro, o tu mismo, estáis confundiendo campos de clase, con campos static.
Todos los arrays de primitivas se inicializan por defecto con los valores de sus elementos a cero. Los arrays de clases se inicializan a null. Tanto da si son campos de la clase, como variables internas de métodos.

Los enteros en java tienen límites superior e inferior:

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#MAX_VALUE

MAX_VALUE

public static final int MAX_VALUE
A constant holding the maximum value an int can have, 2<elevado a>31-1.
See Also:
Constant Field Values

MIN_VALUE

public static final int MIN_VALUE
A constant holding the minimum value an int can have, -2<elevado a>31.
See Also:
Constant Field Values

Otra cuestión es una variable de la clase Integer, que puede tomar el valor null.

enero 29, 2013 | Registered Commenterchoces

hola, bueno leendo un poco lo que dices @shao, tecnicamente no se puede tener valores infinitos en las casillas de los vectores, en lenguajes con c, los vectores tenian basura que asi se le llama a los datos que estaban en la memoria que ahora se reservo para el vector en cuestion, java decidió inicializar todas las variables con su valor por defecto para evitar estos valores desconocidos que se tenían en variables que eran declaradas pero no inicializadas.

El problema no son que java inicialize el valor a 0 sino que hacer con este valor, como te dije en mi anterior post, que es hacer una politica de acceso. lo que te proponia es que los valores más pequeños se fueran saliendo del array si tuvieras esto
-1,0,1,2,3 y insertas un valor 0 el -1 se va. porque esa es la politica, dado que el vector es de tamaño finito lamentablemente algunos elementos se van a tener que morir. ahora lo que no entiendo es porque quieres usar un vector de un tamaño finito si vas a meter más elementos que pueda aceptar el array.

mira se me ocurrio lo siguiente:

primero crear una variable indice que indica cual es la ultima casilla utilizada de esta manera
te limitas a ver solo los valores que se han insertado los otros no importa
ejemplo
indice=0, inserto 0
|0|
lo inserto y se aumenta la variable indice
indice=1,inserto -2
ahora haces la comparación ves que 0 debe insertarse en la casilla 1 y -2 en la otra casilla
|-2|0| ahora indice =1
podías decir es igual que lo que plantee anteriormente que ayuda indice, pues lo que ayuda es asegurarte que los valores en el vector son tuyos y no por defecto de java. que hacer cuando indice sea igual= al tamaño del vector es cosa tuya podias mandarlo al inicio

pero estoy de acuerdo con @chose es más facil insertar el valor y después ordenar.
para insertar valores en un vector yo siempre uso un indice que me indica cual es la casilla disponible es decir siempre inserto al ultimo, incluso lo más recomendable es que limites
lo que vas ordenar es decir podía darte resultados no deseados si ordenas todo el vector
ya que tomaria encuenta los valores por defecto que deja java revolviendo con los tuyos
asi que lo mejor es ordenar de 0 hasta donde esta el indice -1 ya que el indice siempre esta en la casilla que se inserta.

sabes ese algoritmo de ordenar al insertar, se me hace complicado y más adecuado en una estructura dinamica ya que tienes que encontrar un punto donde insertar el nuevo elemento que muchas veces va ser en medio, que en una estructura estatica equivaldría a desplazar datos hacia izquierda o derecha lo que si esta al tope pierdes los datos del extremo. ahora en una dinamica solo es de desenlazar y enlazar nodos
bueno dejo hasta aqui el post que ya se hiso largo ajajja

enero 29, 2013 | Registered Commenterjhosep

bueno como me pareció interezante la propuesta @shao me decidi implementarla
dejo el codigo (el ordenamiento es acedente)
public class Ordenacion {

int[] datos;
int indice;

public Ordenacion(int size) {
datos = new int[size];
indice = 0;
}

public boolean addValor(int dato) {
if (indice >= datos.length) {
return false;
}
int posicion = buscarCasilla(datos, indice, dato);

desplazarDerecha(posicion, indice, datos);
datos[posicion] = dato;
indice++;
return true;

}

public void desplazarDerecha(int inicio, int ultimo, int data[]) {

int copy[] = new int[data.length];

System.arraycopy(data, 0, copy, 0, copy.length);
System.arraycopy(copy, inicio, data, inicio + 1, ultimo - inicio);


}

public int buscarCasilla(int data[], int tope, int dato) {


for (int i = 0; i < tope; i++) {
if (data[i] > dato) {
return i;
}

}

return tope;

}

public void imprimir() {

System.out.print("{");
for (int i = 0; i < indice; i++) {
System.out.print(datos[i]);
if (i + 1 < indice) {
System.out.print(",");
}
}
System.out.println("}");
}

public static void main(String arg[]) {

Ordenacion or = new Ordenacion(10);

or.addValor(9);
or.imprimir();
or.addValor(10);
or.imprimir();
or.addValor(6);
or.imprimir();
or.addValor(7);
or.imprimir();
or.addValor(-1);
or.imprimir();
or.addValor(-2);
or.imprimir();
or.addValor(5);
or.imprimir();
or.addValor(14);
or.imprimir();
or.addValor(15);
or.imprimir();
or.addValor(11);
or.imprimir();
}
}

basicamente la clase trabaja como dije en mi anteriores post,
que en resumen es
busca la casilla
desplaza los elementos a la derecha para evitar que se sobreescriban
inserta el valor
aumenta el indice.

el indice lo que hace es limitar el vector a solo ver lo que se ha insertado

creo que no es el mejor codigo porque apenas si le dedique 1/2 hora .
sobre la eficiencia también tengo un poco de dudas, pero creo que hace lo que querías
@shao

bueno me gustaria saber si te ayudo @shao

saludos

enero 29, 2013 | Registered Commenterjhosep