Dev - C++ - programación en c, ayuda!!

 
Vista:

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.
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder