¿Cómo ordenar datos?

Por el 12 de mayo de 2008

en: Programacion

Uno de los procedimientos más comunes a la hora de procesar datos y generar aplicaciones de todo tipo es el procesamiento de los datos, por procesamiento entendemos la clasificación u ordenación de los mismos.

A menudo esta acción pasa desapercibida porque interactuamos con datos almacenados en bases de datos, las bases de datos nos dan las herramientas necesarias para ordenar, buscar y recuperar aquellos datos que deseamos (“order by id”,”where nombre like ‘%Man%’”); ¿Qué ocurriría si no pudieramos utilizar estas herramientas?

Pues tendriamos que encontrar un método de ordenación y procesamiento de datos que se adecúe a nuestras necesidas, en primer lugar deberíamos de analizar los diferentes métodos de ordenación y determinar cuántas comparaciones se realizarían en los diferentes casos que nos encontremos.

En este análisis deberíamos estudiar si necesitamos orden ascendente o descendente o si los datos a ordenar van a ser numéricos o alfanuméricos.

Los métodos son bien conocidos para muchos y todo el mundo que ha programado, se habrá encontrado alguna vez con la realización de alguno de estos famosos algoritmos de ordenación.

Quicksort

Se basa en subdividir la estructura de datos en trozos más pequeños introduciendo un orden relativo entre ellas, en otras palabras “divide y vencerás” es la técnica de ordenación simple más rápida conocida | Quicksort.

Intercambio

Tambien es conocido cómo el “método Burbuja” se trata de ciclar la comparación de elementos adyacentes de una lista e intercambiar las posiciones si el elemento mayor es el que esta en la siguiente posición, es bastante eficiente pero empieza no serlo en listas de más de 100 elementos | Burbuja


Inserción

El fundamento es insertar los elementos no ordenados entre los que ya lo están, es muy parecido a la manera en la que habitualmente se ordena una baraja de cartas, hay diferentes métodos de insercción | Insercción.

Pero aún sabiendo la teoría nos podemos encontrar con muchisimos problemas, por ejemplo partimos de la base de una estructura de datos simple, pero que pasaría si lo que tenemos que ordenar es un array bidimensional.

Como se sabe un array bidimensional puede tener varias filas, y en cada fila puede tener un diferente números de elementos o columnas, si quisieramos ordenar los datos por estos elementos se complica un poco su ordenación…

Aquí tenemos una solución a este problema planteado:

function ordenar_array() {
$n_parametros = func_num_args(); // Obenemos el número de parámetros
if ($n_parametros<3 || $n_parametros%2!=1) { // Si tenemos el número de parametro mal...
return false;
} else { // Hasta aquí todo correcto...veamos si los parámetros tienen lo que debe ser...
$arg_list = func_get_args();

if (!(is_array($arg_list[0]) && is_array(current($arg_list[0])))) {
return false; // Si el primero no es un array...MALO!
}
for ($i = 1; $i<$n_parametros; $i++) { // Miramos que el resto de parámetros tb estén bien...
if ($i%2!=0) {// Parámetro impar...tiene que ser un campo del array...
if (!array_key_exists($arg_list[$i], current($arg_list[0]))) {
return false;
}
} else { // Par, no falla...si no es SORT_ASC o SORT_DESC...a la calle!
if ($arg_list[$i]!=SORT_ASC && $arg_list[$i]!=SORT_DESC) {
return false;
}
}
}
$array_salida = $arg_list[0];

// Una vez los parámetros se que están bien, procederé a ordenar...
$a_evaluar = "foreach (\$array_salida as \$fila){\n";
for ($i=1; $i<$n_parametros; $i+=2) { // Ahora por cada columna...
$a_evaluar .= " \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
}
$a_evaluar .= "}\n";
$a_evaluar .= "array_multisort(\n";
for ($i=1; $i<$n_parametros; $i+=2) { // Ahora por cada elemento...
$a_evaluar .= " \$campo{$i}, SORT_REGULAR, \$arg_list[".($i+1)."],\n";
}
$a_evaluar .= " \$array_salida);";
// La verdad es que es más complicado de lo que creía en principio... :)

eval($a_evaluar);
return $array_salida;
}
}

// EJEMPLO DE USO:

// Otra manera de declarar un array bidimensional de estos...
$array_a_ordenar = array(
0 => array(‘campo1′ => ‘patatas’, ‘campo2′ => 1, ‘campo3′ => ‘kkkk’),
1 => array(‘campo1′ => ‘coles’, ‘campo2′ => 3, ‘campo3′ => ‘aaaa’),
2 => array(‘campo1′ => ‘tomates’, ‘campo2′ => 1, ‘campo3′ => ‘zzzz’),
3 => array(‘campo1′ => ‘peras’, ‘campo2′ => 7, ‘campo3′ => ‘hhhh’),
4 => array(‘campo1′ => ‘tomates’, ‘campo2′ => 4, ‘campo3′ => ‘bbbb’),
5 => array(‘campo1′ => ‘aguacates’, ‘campo2′ => 3, ‘campo3′ => ‘yyyy’),
);

$array_ordenadito = ordenar_array($array_a_ordenar, ‘campo2′, SORT_DESC, ‘campo1′, SORT_DESC) or die(‘
ERROR!
‘);

$array_ordenadito2 = ordenar_array($array_a_ordenar, ‘campo3′, SORT_DESC, ‘campo2′, SORT_DESC, ‘campo1′, SORT_ASC ) or die(‘
ERROR!
‘);

* En caso de ordenar arrays con índices numéricos sustituiriamos ‘campo3′ por 3.

Si lo que se desea ordenar son arrays unidimensionales podríamos utilizar las funciones:
sort(), rsort(), ksort(), arsort(), etc…

Aquí tienes aplicaciones que comparan los diferentes métodos de ordenación:
Sorting Algortihms Demo, Sorting Algortihms Examples, Sorting Algorithms.

1 Respuesta a ¿Cómo ordenar datos?

Avatar

laura flores

30 de septiembre de 2011 a las 1:17 am

importancia de ordenar los dato

Dejar un comentario