PHP - OPTIMIZAR CÓDIGO

 
Vista:

OPTIMIZAR CÓDIGO

Publicado por SILVIA (80 intervenciones) el 13/05/2015 09:32:00
¿Cómo podría optimizar este código?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
echo "Función definida por el usuario que ordene un vector de menor a mayor.<br>";
function ordenar_vector($v)
{
    $i=0;
    $cantidad=0;
    foreach($v as $elemento)
        {
        $cantidad++;
        }
    while ($i<$cantidad)
    {
        $j=0;
        while ($j<$cantidad)
        {
            if ($v[$i]<$v[$j])
            {
            $menor=$v[$i];
            $v[$i]=$v[$j];
            $v[$j]=$menor;
            }
        $j++;
        }
    $i++;
    }
    return $v;
}
$v=array(5,3,4,2,1);
echo "<pre>";
print_r($v);
print_r(ordenar_vector($v));

El profesor me dijo que estaba bien, pero me dijo que podía sustituir el foreach por un for y lo de $cantidad con un count, lo estoy intentando pero no me sale. ¿Podeis ayudarme?

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

OPTIMIZAR CÓDIGO

Publicado por turco (5 intervenciones) el 13/05/2015 17:31:19
muestra1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

OPTIMIZAR CÓDIGO

Publicado por SILVIA (80 intervenciones) el 13/05/2015 22:03:52
Gracias funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

OPTIMIZAR CÓDIGO

Publicado por Maxi (13 intervenciones) el 16/05/2015 02:18:05
Utiliza el método de ordenamiento quick sort:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function ordenar_vector( $array ) {
    if( count( $array ) < 2 ) { //si el array tiene un solo elemento lo regreso, no es necesario el ordenamiento.
        return $array;
    }
    $left = $right = array( ); //defino mi lado derecho e izquierdo
    reset( $array ); //coloco el puntero del array pasado como parámetro en la posición 0
    $pivot_key  = key( $array );
    $pivot  = array_shift( $array ); //elijo el primer elemento como mi pivot (hay dependiendo de el largo del array y como ingresan los elementos hay formas más eficientes de elegir un pivot, leer al respecto)
    foreach( $array as $k => $v ) { //recorro el array
        if( $v < $pivot )
            $left[$k] = $v; //paso todos los elementos menores al pivot del lado izquierdo del array
        else
            $right[$k] = $v; //paso todos lo elementos mayores al pivot del lado derecho del array
    }
    return array_merge(ordenar_vector($left), array($pivot_key => $pivot), ordenar_vector($right)); //ejecutor recursivamente hasta que todos los elementos estén ordenados, devuelvo lo subarray generados (left y right) como un único array
}

La diferencia de velocidad con otros métodos de ordenamiento se hace notar cuando el array a ordenar es muy grande.

Más información:
https://www.youtube.com/watch?v=aQiWF4E8flQ
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar