Foros del Web » Programación para mayores de 30 ;) » C/C++ »

C/C++ Ordernar array ixj

Estas en el tema de C/C++ Ordernar array ixj en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 22/11/2010, 11:49
 
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
  #2 (permalink)  
Antiguo 22/11/2010, 12:03
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: C/C++ Ordernar array ixj

He estado viendo y podrían ser los punteros, pero tampoco se como plantearlo. Un Saludo
  #3 (permalink)  
Antiguo 22/11/2010, 12:07
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: C/C++ Ordernar array ixj

que error te da?
  #4 (permalink)  
Antiguo 22/11/2010, 12:12
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: C/C++ Ordernar array ixj

No ordena xD
  #5 (permalink)  
Antiguo 22/11/2010, 12:19
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: C/C++ Ordernar array ixj

Bueno especificando un poco más, si pongo ordenar la columna 1 funciona pero las dos columnas otras no se mueven respecto a el valor de la fila, si pongo la C=2 o C=0 no las ordenan, si no las desordenan aun más
  #6 (permalink)  
Antiguo 22/11/2010, 12:31
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: C/C++ Ordernar array ixj

he probado a compilarlo y me da 60 errores y 7 advertencias.

me he fijado en que declaras una variable dentro de un for:

for(int r=0;r<=2;r++)

esto me suena que en C no se podia hacer (en C++ si), busca en internet sobre esto por que ahora mismo no tengo el libro de C y no lo puedo comprobar.

EDIT: lo he compilado sin el int dentro del for , declarando "r" al principio y se han ido todos lo errores, asi que tiene que ser eso. ya me diras si se ha solucionado
  #7 (permalink)  
Antiguo 22/11/2010, 12:36
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: C/C++ Ordernar array ixj

Cita:
Iniciado por Munire Ver Mensaje
he probado a compilarlo y me da 60 errores y 7 advertencias.

me he fijado en que declaras una variable dentro de un for:

for(int r=0;r<=2;r++)

esto me suena que en C no se podia hacer (en C++ si), busca en internet sobre esto por que ahora mismo no tengo el libro de C y no lo puedo comprobar.
En C++ si se puede(creo), en el DEV-C++ 0 errores me da, es más si no las llamo si me da error el error.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:52.