Ver Mensaje Individual
  #12 (permalink)  
Antiguo 14/04/2011, 05:45
Chem0n
 
Fecha de Ingreso: noviembre-2007
Mensajes: 2
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: como buscar los dos numeros mas grandes de un array?

Buenas, aqui dejo mi idea, por si puede ayudar, pero lo mejor es hacerlo uno mismo, para aprender y entrenar la mente, que es por eso por lo que nuestros profesores nos mandan este tipo de ejercicios en la facultad.
Esta claro que se puede hacer de una forma mas simple, pero nuestros profesores nos mandan los ejercicios para practicar y aprender algunos conceptos como la recursividad o el paso de parametros.

Con mi ejemplo te das cuenta como usar recursividad y que el paso de parametros para objetos de tipo no simple es por referencia.

Código:
public void NumMasGrandes(int[] vector, int[] numgran, int idx){
        // comprobamos que no hemos llegado al final del vector
        if ( idx < vector.length ){
            //inicializamos numgran con los dos primeros numeros del vector.
            //se sobreentiende que numgran es un array de 2 enteros.
            if ( idx < 2 ){
                numgran[0] = vector [0];
                numgran[1] = vector [1];
                NumMasGrandes(vector, numgran, idx+2);
            }else{
                if ( ( vector[idx]> numgran[0] ) && ( vector[idx]> numgran[1] )){
                    if ( numgran[0] < numgran[1] ){
                        numgran[0] = vector[idx];
                    }else{
                        numgran[1] = vector[idx];
                    }
                }else if ( vector[idx]> numgran[0] ){
                    numgran[0] = vector[idx];
                }else if ( vector[idx]> numgran[1] ){
                    numgran[1] = vector[idx];
                }else{
                }
                NumMasGrandes(vector, numgran, idx+1);
            }
        }
    }
Código:
        int vector[] = {0, 11, 11, 12, 11, 12, 1, 12, 13, 12, 11, 12, 8, 7};
        int numgran[] = new int[2];
        NumMasGrandes(vector, numgran, 0);
        System.out.println("Los dos valores mayores son "+numgran[0]+" y "+numgran[1]+".");
vector es el array a evaluar, numgran es un array de dimension 2 para almacenar los 2 numeros mas grandes e idx es el indice para recorrer el vector.

Si le pasamos numgran instanciado e inicializado ( es decir numgran[0] = -1 y numgran[1] = -1 ) el metodo todavia queda mas sencillo.

Código:
public void NumMasGrandes(int[] vector, int[] numgran, int idx){
        // comprobamos que no hemos llegado al final del vector
        if ( idx < vector.length ){
                if ( ( vector[idx]> numgran[0] ) && ( vector[idx]> numgran[1] )){
                    if ( numgran[0] < numgran[1] ){
                        numgran[0] = vector[idx];
                    }else{
                        numgran[1] = vector[idx];
                    }
                }else if ( vector[idx]> numgran[0] ){
                    numgran[0] = vector[idx];
                }else if ( vector[idx]> numgran[1] ){
                    numgran[1] = vector[idx];
                }else{
                }
                NumMasGrandes(vector, numgran, idx+1);
        }
    }
Código:
        int vector[] = {0, 11, 11, 12, 11, 12, 1, 12, 13, 12, 11, 12, 8, 7};
        int numgran[] = new int[2];
        numgran[0] = -1;
        numgran[1] = -1;
        NumMasGrandes(vector, numgran, 0);
        System.out.println("Los dos valores mayores son "+numgran[0]+" y "+numgran[1]+".");

Y aqui otra ejemplo bastante simple para buscar los X numeros mas altos en un array, simplemente declaramos un array de X de longitud ( en mi ejemplo es de longitud 4 pero puede ser de cualquier longitud ) y ya esta y se lo pasamos a la funcion NumMasGrandes2

Código:
public int IdxNumMasPequeño(int[] auxvec, int idx, int idxpeq){
        if ( idx < auxvec.length ){
            if ( auxvec[idx] < auxvec[idxpeq])
                idxpeq = idx;
            return ( IdxNumMasPequeño( auxvec, idx+1, idxpeq ) );
        }else
            return idxpeq;
     }

public void NumMasGrandes2(int[] vector, int[] numgran, int idx){
        // comprobamos que no hemos llegado al final del vector
        if ( idx < vector.length ){
            //inicializamos numgran con los primeros valores de vector
            if ( idx == 0 ){
                for (int i=0;i<numgran.length;i++)
                    numgran[i] = vector [i];
                NumMasGrandes2(vector, numgran, (idx+numgran.length));
            }else{
                int idxnummaspeq = IdxNumMasPequeño(numgran, 0, 0);
                if ( vector[idx] > numgran[idxnummaspeq]){
                    numgran[idxnummaspeq] = vector[idx];
                }
                NumMasGrandes2(vector, numgran, idx+1);
            }
        }
    }

        int vector[] = {2, 1, 3, 9, 5, 6, 4, 8, 7};
        int numgran2[] = new int[4];
        NumMasGrandes2(vector, numgran2, 0);
        System.out.print("M2: Los mayores valores son "+numgran2[0]);
        for (int i=1;i+1<numgran2.length;i++)
            System.out.print(", "+numgran2[i]);
        System.out.print(" y "+numgran2[numgran2.length-1]);

Última edición por Chem0n; 14/04/2011 a las 08:25