programación en c, ayuda!!
Publicado por Miguel López (1 intervención) el 15/04/2016 15:16:19
modifique el código, para sustituir dichas operaciones por una pila que usted deberá
desarrollar.
desarrollar.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
#include <stdlib.h>
#define TAM 20
typedef struct DATO dato;
struct DATO
{
int iI, iF;
};
void vQuickSort (int *piA, int iI, int iF);
char cArregloMenorMayor (int *piA, int iTam);
int main ()
{
int iA[TAM];
int i;
/*Primero llenamos con numeros aleatorios*/
for (i=0; i<TAM; i++)
{
iA[i] = rand () % 321;
}
for (i=0; i<TAM; i++)
printf ("%3d, ", iA[i]);
printf ("\n");
/*Mandamos el arreglo, desde donde inicia hasta donde acaba*/
vQuickSort (iA, 0, (TAM-1));
for (i=0; i<TAM; i++)
printf ("%3d, ", iA[i]);
printf ("\n");
/*Comprobamos*/
i = cArregloMenorMayor (iA, TAM);
if (!i)
printf ("Error en orden de arreglo\n");
return (0);
}
void vQuickSort (int *piA, int iI, int iF)
{ /*Ordena de menor a mayor*/
dato *psdA;
int iPivote, iDato, iDif, iAux, i, j, k, iPivoteAux;
int iB[TAM]; /*Arreglo auxiliar*/
/*Pedimos memoria para nuestro arreglo, 10000 por si las dudas*/
psdA = (dato *)malloc (sizeof(dato)*10000);
/*Para iniciar metemos un dato*/
iDato = 0;
psdA[iDato].iI = iI;
psdA[iDato].iF = iF;
iDato++;
/*iI e iF los usaremos como variables*/
while (iDato)
{ /*Sacamos un dato, note el comportamiento de una pila*/
iDato--;
iF = psdA[iDato].iF;
iI = psdA[iDato].iI;
iDif = iF - iI + 1;
switch (iDif)
{
case 0:
case 1:
break;
case 2:
if (piA[iI]>piA[iF])
{
iAux = piA[iI];
piA[iI] = piA[iF];
piA[iF] = iAux;
}
break;
default:
iPivote = ((iF - iI + 1) / 2) + iI;
iAux = piA[iPivote];
/*Los menores al pivote*/
for (i=iI, j=0; i<=iF; i++)
{
if ((piA[i]<iAux)&&(i!=iPivote))
{
iB[j] = piA[i];
j++;
}
}
/*Un nuevo dato*/
if (j>1)
{
psdA[iDato].iI = iI;
psdA[iDato].iF = iI + j - 1;
iDato++;
}
/*El pivote*/
iB[j] = iAux; j++;
iPivoteAux = j;
/*Los mayores al pivote*/
for (i=iI, k=0; i<=iF; i++)
{
if ((piA[i]>=iAux)&&(i!=iPivote))
{
iB[j] = piA[i];
j++; k++;
}
}
/*Otro dato mas*/
if (k>1)
{
psdA[iDato].iI = iI + iPivoteAux;
psdA[iDato].iF = iF;
iDato++;
}
/*Regresamos los datos al original*/
for (i=iI, j=0; i<=iF; i++, j++)
{
piA[i] = iB[j];
}
break;
}
}
}
char cArregloMenorMayor (int *piA, int iTam)
{
int i;
for (i=1; i<iTam; i++)
{
if (piA[i-1]>piA[i]) return (0);
}
return (1);
}
Valora esta pregunta


0