PHP:¿Cómo ordenar un array por el método de ordenación directa?
De Foros del Web
Aquí os pongo las funciones comentadas. Es la ordenación de un array de números, para ordenar objetos a través de sus atributos sería 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)); } }
--elangelcaido 18 Ene 2006
Este artículo es parte de las FAQs de PHP y el Manual de PHP
- Indice de las FAQs: Conceptos, Configuración, Formularios, Manejo de Archivos, Integración con Bases de Datos, Sesiones, Extensiones y Librerías, Seguridad, Funciones, Clases y Objetos, Frameworks
- Agregar al FAQ: PHP: Instrucciones para agregar una pregunta al FAQ de PHP
- Regresar al Foro de Php
