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