Tema: FAQ's de PHP
Ver Mensaje Individual
  #153 (permalink)  
Antiguo 18/01/2006, 04:14
Avatar de elangelcaido
elangelcaido
 
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
Ordenacion Directa

Pregunta: ¿Como ordenar un array por el método de ordenacion directa?
Respuesta: Aqui os pongo las funciones comentadas. Es la ordenacion de un array de numeros, para ordenar objetos a traves de sus atributos seria cambiar 4 cosas.
Código PHP:
<?php
$array
=array(3,45,8,2,5,6,20,9,100,70);
print_r($array);
ordenarInsercionDirecta($array);
echo 
'<br>';
print_r($array);
//FUNCIONES DE ORDENACION DIRECTA
/**
  * Buscar dónde debería estar cierto número si lo insertáramos en la parte ordenada.
  * Es una simple búsqueda secuencial en secuencia ordenada. Si el elemento que
  * vamos a insertar es mayor que todos los de la parte ordenada, el método devuelve
  * -1 (es decir, que "no debería estar ahi"; en este caso, es tanto como decir que
  * no hace falta moverlo).
  * @param $array El array a modificar. Recibe una referencia
  * @param $tamano Número de elementos del array (empezando por la izquierda) que forman parte del trozo ya ordenado.
  * @param $numero Número para el que se pretende encontrar sitio dentro del trozo mencionado.
  * @return La posición que debería ocupar "número" dentro de ese trozo; es -1 si "numero" ya es más grande que todos los elementos del trozo.
  */
function buscarPosicion(& $array$tamano$numero) {
    
$posicion = -1;
    for (
$i 0$i $tamano$i ++)
        if (
$posicion == -1)
            if (
$array[$i] > $numero)
                
$posicion $i;
    return 
$posicion;
}

/**
 * Mover una serie de elementos una posición a la derecha.
 * @param $array El array a modificar. Recibe una referencia
 * @param desde Posición del primer elemento que debe verse afectado por el desplazamiento.
 * @param hasta Posición del último elemento que debe verse afectado por el desplazamiento.
 */
function moverHaciaLaDerecha(& $array$desde$hasta) {
    
// Ya sabemos que no podemos empezar a mover en "desde" (eso sería "empujar" los elementos)
    // sino que tenemos que empezar por el lado "hasta" con un bucle descendente ("tirar" de los elementos)
    
for ($i $hasta$i $desde$i --)
        
$array[$i] = $array[$i -1];
}

/**
 * Ordena el array por el metodo de inserción directa.
 * @param $array El array a modificar. Recibe una referencia
 */
function ordenarInsercionDirecta(& $array) {
    
$i 0;
    
$posicion 0;
    
$numero 0;

    
// Para cada elemento del array, buscaremos su posición adecuada; este bucle es el que recorre
    // dichos elementos.
    // Nótese que no empieza en 0, porque el primer elemento es, de por si, un "sub-array ordenado". Podríamos
    // empezar en 0, pero no tendría ningún efecto; empezamos a buscarle sitio al segundo
    // elemento (índice 1).
    
for ($i 1$i count($array); $i ++) {
        
$numero $array[$i];
        
//mensaje("Colocar el elemento de posición " + i + " (es un " + numero + ")");
        
$posicion buscarPosicion($array$i$numero);
        
//if (posicion == -1) mensaje("(Ya esta en su sitio)"); else mensaje("Su posición adecuada es la de índice " + posicion);
        // Si la posición es -1, es que el elemento ya está en su sitio y no
        // hace falta insertarlo en el "sub-array ordenado".
        
if ($posicion != -1) {
            
//mensaje("Desplazamos los elementos entre los índices " + posicion + " y " + (i-1) + " (inclusive) una posición a la derecha");
            // Movemos a la derecha los elementos que hay entre la posición de destino
            // y el final de la parte ordenada (inclusive), para hacerle un hueco libre
            // al elemento que pretendemos poner en la posición de destino
            
moverHaciaLaDerecha($array,$posicion$i);
            
//mensaje("Y ponemos en su sitio el " + numero);
            // Hecho el hueco, ponemos en él el número en cuestión
            
$array[$posicion] = $numero;
        }
        
//mensaje("Y ahora la matriz queda (la zona ya ordenada se subraya):\n" + toString());
        //mensaje(subrayar(i));
    
}

}
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org