C/Visual C - Quick sort en C con estructuras

 
Vista:

Quick sort en C con estructuras

Publicado por Benito (1 intervención) el 22/11/2019 11:23:14
Buenas!

Necesito una pequeña ayuda con esto que se me ha atacado.

Tengo que ordenar un array de estructuras con Quick Short.

Este es mi codigo:
Estructura:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef enum {FALSE, TRUE} tBoolean;
 
typedef char tCiudad [MAX_CIUDAD];
typedef char tRegion [MAX_REGION];
typedef char tFecha [MAX_FECHA];
typedef char tTipoIntox [MAX_INTOXICACION];
 
typedef struct {
int Registro;
tCiudad Ciudad;
tRegion Region;
tTipoIntox TipoIntox;
tFecha FechaIni;
tFecha FechaFin;
int NumAfectados;
int NumMuertos;
int NumCronicos;
} tIntoxicacion;

Swap:
1
2
3
4
5
6
void swap(tIntoxicacion* a, tIntoxicacion* b)
{
	tIntoxicacion t = *a;
	*a = *b;
	*b = t;
}

Partir:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int Partir (tIntoxicacion **p, int primero, int ultimo, int TipoOrd)
{
    if(TipoOrd == 6)//Ordena por nº de afectados
    {
        int pivot = (*p)[primero].NumAfectados;
        int i = (ultimo - 1);
        for (int j = ultimo; j <= primero- 1; j++)
        {
            if ((*p)[j].NumAfectados <= pivot)
            {
                i++;
                swap(&(*p)[i], &(*p)[j]);
            }
        }
        swap(&(*p)[i + 1], &(*p)[primero]);
        return (i + 1);
    }
    else if(TipoOrd == 7)//ordena por nº de muertos
    {
        int pivot = (*p)[primero].NumMuertos;
        int i = (ultimo - 1);
        for (int j = ultimo; j <= primero- 1; j++)
        {
            if ((*p)[j].NumMuertos <= pivot)
            {
                i++;
                swap(&(*p)[i], &(*p)[j]);
            }
        }
        swap(&(*p)[i + 1], &(*p)[primero]);
        return (i + 1);
    }
    else
    {
        int pivot = (*p)[primero].NumCronicos;
        int i = (ultimo - 1);
        for (int j = ultimo; j <= primero- 1; j++)
        {
            if ((*p)[j].NumCronicos <= pivot)
            {
                i++;
                swap(&(*p)[i], &(*p)[j]);
            }
        }
        swap(&(*p)[i + 1], &(*p)[primero]);
        return (i + 1);
    }
 
}
Quick Short:
1
2
3
4
5
6
7
8
9
void QuickSort (tIntoxicacion **p, int izda, int dcha, int TipoOrd)
{
    if (dcha < izda)
	{
            int pi = Partir((*p), dcha, izda, TipoOrd);
            QuickSort((*p), dcha, pi - 1, TipoOrd);
            QuickSort((*p), pi + 1, izda, TipoOrd);
	}
}

Y así llamo al a función:
tIntoxicacion *pDatos;
QuickSort(&pDatos, 0, NumLineas-1, 7);

Los datos son los leidos desde un excel.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Quick sort en C con estructuras

Publicado por Rodrigo (119 intervenciones) el 22/11/2019 18:06:41
No dices que es lo que esta mal de tu programa o que es lo que tu ves que esta mal.
No compila? Compila y funciona pero hace nada? Se ejecuta y no ordena? Ordena al reves?

Sugiero reducir la redundancia en el codigo para simplificarlo un poco

Que tal crear una funcion que se llame comparar y que reciba 2 objetos de tipo tIntoxicacion y por que cosa comparar y que devuelva un entero indicando el resultado de la comaracion?

i
1
2
3
4
5
6
7
nt comparar(tIntoxicacion t1, tIntoxicacion t2, int tipoOrd) {
    switch(tipoOrd) {
      case NRO_AFECTADOS: return t1.NumAfectados - t2.NumAfectados;  // NRO AFECTADOS es una constante que valdria 6
      case NRO_MUERTOS: return t1.NumMuertos - t2.NumMuertos;  // NRO MUERTOS es una constante que valdria 7
//... etc    
   }
}

y luego en tu funcion partir, cambias todas las distintas invocaciones que tienes. Remueves todos los if()s, haces solo 1 ciclo e invocas comparar().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Quick sort en C con estructuras

Publicado por Benito (1 intervención) el 23/11/2019 09:16:37
Buenas,


Muchas gracias por la sugerencia!

Lo que me pasa en el código es que no ordena
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Quick sort en C con estructuras

Publicado por Rodrigo (119 intervenciones) el 23/11/2019 16:03:57
El titulo parece de este post parece querer ordenar un arreglo con structs pero tu funcion recibe un tIntoxicacion **p, parece ser un arreglo de punteros a struct, en vez de un arreglo de structs.

Puedes mostrar como esta definido el arreglo y donde invocas la funcion quicksort?

Tambien sospecho de la funcion Partir, dice recibir un tIntoxicacion **p, pero al invocarla desde QuickSort le pasas *p osea un (tIntoxicacion *) no un (tIntoxicacion **). Si yo fuera compilador, reclamaria ahi, pero tu dices que esto compila, entonces seguro que soy yo el que no entiende tanto :)

Creo que es posible reducir 1 nivel de indireccion y simplificar tu codigo aun mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar