Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/11/2010, 11:49
Mexen
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
C/C++ Ordernar array ixj

Hola, necesitaba un script que ordenara las filas de un elemento en base a una columna, entonces decidí usar el metodo quicksort para una array unidimensional y tranformarlo, al fin al cabo con ordenar una esa columna, ya estaría.


Codigo

Genera Matriz [20][2]
Muestro
Arreglo
- C=Columna 2, la que deseo arreglar, todos los elementos es como si fuera un quicksort estuvieran en la columna 2
- Los 3 for es hacer lo que hace el metodo para guardar una fila completa y guardarla.

Código:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
/* El tamaño del arreglo: solo 20 */
#define TAM 20
#define M 2
#define C 2
double generar_elementos (double arreglo[][M]); /* Genera numeros aleatorios para llenar el arreglo */
void mostrar (double arreglo[][M]);          /* Imprime el arreglo */
void quicksort (double arreglo[][M], int inf, int sup);  /* Ordenamiento rapido  */
int main()
{
     double arreglo[TAM][2];
     
     /*Array */
     generar_elementos(arreglo);

    // printf("Arreglo original:");
     mostrar(arreglo);

     /* Ordena arreglo por quicksort */
     quicksort(arreglo, 0, TAM - 1);

     printf("Arreglo ordenado por quicksort");
     mostrar(arreglo);
   
     getch();
}


double generar_elementos (double arreglo[][M])
{
     int i,j;

     /* Introducimos una semilla para los n£meros aleatorios */
     srand ((unsigned) time(NULL));

     for (i=0; i<TAM; i++)
         for (j=0; j<2; j++)
          arreglo[i][j] = rand()%TAM;    /* Solo numeros pequenios... */

     return TAM;
}

void mostrar (double arreglo[][M])
{
     int i;

     for (i=0; i<TAM; i++)
          printf ("\n\tElemento[%2d] = %f y %f y %f ", i, arreglo[i][0],arreglo[i][1],arreglo[i][2]);

     printf ("\n\n");
}

void quicksort (double arreglo[][M], int inf, int sup)
{
     double elem_div = arreglo[sup][C];
     double temp[5];
     double tempi;
     int i = inf - 1, j = sup;
     int cont = 1;

     if (inf >= sup)     /* Se cruzaron los indices ? */
          return;

     while (cont)
          {
          while (arreglo[++i][C] < elem_div);
          while (arreglo[--j][C] > elem_div);
          /* ¨Se cumple la condici¢n ? */
          if (i < j)
               {
                   for(int r=0;r<=2;r++) {temp[r]=arreglo[i][r]; }//printf ("%f", temp[r]);
                   for(int r=0;r<=2;r++) {arreglo[i][r]=arreglo[j][r];}//printf ("/n/n%f", arreglo[i][r]);}//printf ("%2d", r);       
                   for(int r=0;r<=2;r++) {arreglo[j][r]=temp[r];}
              //tempi = arreglo[i][C];
              //arreglo[i][C] = arreglo[j][C];
               //arreglo[j][C] = tempi;
               }
          else
              cont = 0;
          }
     /* Dejamos el elemento de divisi¢n en su posici¢n final */
     for(int r=0;r<=2;r++) { temp[r]=arreglo[i][r];}
     for(int r=0;r<=2;r++) {arreglo[i][r]=arreglo[sup][r];}
     for(int r=0;r<=2;r++) {arreglo[sup][r]=temp[r];}
     //tempi = arreglo[i][C];
     //arreglo[i][C] = arreglo[sup][C];
     //arreglo[sup][C] = tempi;
              //printf ("\n\%2d", i);
     /* Aplicamos recursivamente a los subarreglos generados */
     quicksort (arreglo, inf, i - 1); 
     quicksort (arreglo, i + 1, sup);
}

Lllevo 3 dias donde puede estar el error, y no consigo localizar y la cabeza empieza a estar como un bombo :D.


Un Saludo y gracias