Ver Mensaje Individual
  #12 (permalink)  
Antiguo 20/08/2008, 18:19
Avatar de Mort20
Mort20
 
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: ¿Como solicito una cantidad n de numeros y luego los ordeno en php?

Tu problema está claro que es que no entiendes como va el algorismo de la burbuja. Si te fijas en el cuerpo del 2º for mira cual es mayor y actúa en función de eso. Ahí es donde se define si se ordenará de forma ascendiente o descendiente.
De todas formas el algorismo de la burbuja es el peor de todos, puesto que es sumamente ineficiente. Aquí va uno mejor (el de ordenación por fusión, también llamado mergesort):

Código PHP:
<?php
function mergesort($arr) {
    
$sl round((count($arr)/2));
    
$sr count($arr)-$sl;
    
$l array_slice($arr0$sl);
    
$r array_slice($arr$sl);
 
    if(
$sl 1) {
        
$l mergesort($l);
    }
    if(
$sr 1) {
        
$r mergesort($r);
    }
    
$res merge($l$r);
    return 
$res;
 
}
 
function 
merge($l$r) {
    
$lc $rc $mc 0;
    
$res = array();
    
$cl count($l);
    
$cr count($r);
    while(
$lc $cl && $rc $cr) {
        if(
$l[$lc] < $r[$rc]) {
 
            
$res[$mc++] = $l[$lc++];
        }
        else {
            
$res[$mc++] = $r[$rc++];
        }
 
 
 
 
    }
    
$cl_t count($l);
    while(
$lc $cl_t) {
        
$res[$mc++] = $l[$lc++];
    }
    
$cr_t count($r);
    while(
$rc $cr_t) {
        
$res[$mc++] = $r[$rc++];
    }
    return 
$res;
}
?>
Para ejecutarlo sólo debes hacer: $array_a_ordenar = mergesort($array_a_ordenar);
Aquí queda ordenado de forma ascendiente.

Para cambiarlo la clave está en la función merge();
Esta función lo que hace es unir dos arrays, parecido a array_merge(); del PHP sólo que esta no cumple exactamente con lo que debería pues no ordena.
Esta fusión se hace de esta forma: teniendo en cuenta que sendos arrays están ordenados, se comprueba des del inicio hasta el final del array más corto qué elemento de ambos (es decir, array1[$c] y array2[$c]) es más pequeño. En función de eso pones un elemento u otro en tu array resultado ordenado, y avanzas un puntero u otro de arrays a fusionar para saber qué elementos se han colocado y cuales no. Una vez recorrido hasta el final uno de los dos arrays, se termina de agregar por el final el resto de elementos del array no recorrido del todo.

Hay algoritmos más eficientes, como el quicksort(); sin embargo este no es estable. Para tu caso te iría bien igual, pero para otros casos podría darte algún conflicto en los empates.
También hay otros estables bastante eficientes, como ordenación por selección, ordenación por inserción... Busca por google y encontrarás bastantes,
__________________
Un Lannister siempre cumple sus promesas