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));
}
}