Me explico: necesito ordenar un array de fechas del siguiente formato: 2012/01/01, 2012/01/01, 1985/01/04, 1995/06/07, 2001/02/02. Bien, este sería el array de fechas @fechas. Asociado a este array relleno otros dos arrays: un array de títulos @titulos y un array de nombres de fichero @nombresDeFichero.
El tema es que las posiciones son correlativas en los tres. Es decir la posición $fechas[0] se corresponde con $titulos[0] y con $nombresDeFichero[0]. Así al intercambiar las fechas debemos intercambiar también las posiciones en el otro array. Lo he intentado de este modo:
Using perl Syntax Highlighting
- ##Implementación del algoritmo quicksort
- sub colocar {
- ##Debemos adaptar un poco el algoritmo para nuestro
- ##Caso concreto de comparación de fechas
- guardarLog("ENTRA EN COLOCAR *************************************************** \n\n\n\n\n\n\n");
- my ( @fechas, @titulos, @nombreFichero, $b, $t ) = @_;
- for ( my $i = 0; $i < $#fechas; $i++ ) {
- guardarLog( "ARRAY DE FECHAS DENTRO DEL QUICKSORT " . $fechas[$i] . "\n\n\n" );
- }
- my $i;
- my $pivote;
- my $valor_pivote;
- my $temp;
- my $tempTitulos;
- my $tempFicheros;
- ##Objeto de tipo dateTime nos servirá para las comparaciones
- my $Strp = new DateTime::Format::Strptime( pattern => '%Y-%m-%d' );
- $pivote = $b;
- ##Valor pivote recoge una de las fechas
- ##El valor del pivote con la fecha parseada
- #Vamos a parsear solo para la comparación
- $valor_pivote = $fechas[$pivote];
- my $valor_pivoteParser = $Strp->parser_dateTime($valor_pivote);
- for ( $i = $b + 1; $i <= $t; $i++ ) {
- ##Tenemos que parsear cada elemento que se va a comparar
- my $fechaParser = $Strp->parse_datetime( $fechas[$i] );
- ##Tenemos en este punto las dos fechas con un formato adecuado
- if ( ( DateTime->compare( $fechaParser, $valor_pivoteParser ) == -1 ) ) {
- #Antes
- #if($fechas[$i] < $valor_pivote){
- ##Intercambios, además del intercambio en el array de fechas
- ##Debemos hacer los intercambios en el array de títulos y
- ##Array de nombre fichero
- ##Para el array con las fechas
- $pivote++;
- $temp = $fechas[$i];
- $fechas[$i] = $fechas[$pivote];
- $fechas[$pivote] = $temp;
- ##Para el array con los títulos
- $tempTitulos = $titulos[$i];
- $titulos[$i] = $titulos[$pivote];
- $titulos[$pivote] = $temp;
- ##Para el array con los nombres de fichero
- $tempFicheros = $nombreFichero[$i];
- $nombreFichero[$i] = $nombreFichero[$pivote];
- $nombreFichero[$pivote] = $temp;
- }
- }
- ##Para la ordenación del array de fechas
- $temp = $fechas[$b];
- $fechas[$b] = $fechas[$pivote];
- $fechas[$pivote] = $temp;
- ##Ordenamos el array de títulos
- $tempTitulos = $titulos[$b];
- $titulos[$b] = $titulos[$pivote];
- $titulos[$pivote] = $tempTitulos;
- ##Ordenamos el array con los nombres de los ficheros
- $tempFicheros = $nombreFichero[$b];
- $nombreFichero[$b] = $nombreFichero[$pivote];
- $nombreFichero[$pivote] = $tempFicheros;
- return $pivote;
- }
- ##Implementación del algoritmo quicksort
- ##Nota: Los tres parámetros de la llamada inicial a Quicksort son
- ## array[0],0,numero_elementos -1
- sub quicksort {
- ##Es una modificación del algoritmo de ordenación quicksort
- ##Al tiempo que ordena el array de fechas tiene que ordenar
- ## el array de títulos y el array de nombre fichero
- ##Parámetros que recibe
- my ( $fechas, $titulos, $nombreFichero, $b, $t ) = @_;
- guardarLog("ENTRA EN QUICKSORT *************************************************** \n\n");
- guardarLog( "Valor que llega a quicksort del array de fechas " . $fechas[0] );
- guardarLog( "Valor que llega al quicksort del array de títulos " . $titulos[0] );
- guardarLog( "Valor que llega al quicksort del array de nombreFichero " . $nombreFichero[0] );
- guardarLog( "Valor de la variable b " . $b );
- guardarLog( "Valor de la variable t " . $t );
- my $pivote;
- if ( $b < $t ) {
- ##Parámetros:
- ##Array de títulos, de fechas y nombre fichero
- $pivote = colocar( @fechas, @titulos, @nombreFichero, $b, $t );
- quicksort( \@fechas, \@titulos, \@nombreFichero, $b, $pivote - 1 );
- quicksort( \@fechas, \@titulos, \@nombreFichero, $pivote + 1, $t );
- }
- }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Pero tengo problemas con los pasos por referencia y con los valores repetidos en el array de fechas... que no sé muy bien cómo tratarlos...
Bueno, como siempre, ¡muchas gracias por la ayuda! Un saludo.