#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "iostream.h"
#include "ctype.h"
#include "time.h"
// Declaracion de Prototipos
void inicializa ( int a [ 100 ], int *n );
void menu ( char *opcion );
void lee_n_a ( int a [ 100 ], int *n );
void lee_x_a ( int a [ 100 ], int *n );
void lee_r_a ( int a [ 100 ], int *n );
void lee_f_a ( int a [ 100 ], int *n );
void duplica_a ( int a [ 100 ], int b [ 100 ], int n );
void escribe_a ( int a [ 100 ], int n );
void bubbl ( int a [ 100 ], int n );
void selec ( int a [ 100 ], int n );
void inser ( int a [ 100 ], int n );
void quick ( int a [ 100 ], int n, int izq, int der );
void partition ( int a [ 100 ], int n, int izq, int der, int *m );
void recorre ( int a [ 100 ], int lugar, int kf );
void buscachico ( int a [ 100 ], int k0, int kf, int *lugar );
void intercambia ( int *a, int *b );
// Declaracion del void main
void main ( void )
{
int corriendo;
char opcion;
int a [ 100 ];
int b [ 100 ];
int n;
inicializa ( a, &n );
duplica_a ( a, b, n );
corriendo = 1;
while ( corriendo == 1 )
{
menu ( &opcion );
switch ( opcion )
{
case 'n': lee_n_a ( a, &n );
duplica_a ( a, b, n ); break;
case 'x': lee_x_a ( a, &n );
duplica_a ( a, b, n ); break;
case 'r': lee_r_a ( a, &n );
duplica_a ( a, b, n ); break;
case 'f': lee_f_a ( a, &n );
duplica_a ( a, b, n ); break;
case 'e': escribe_a ( b, n ); break;
case 'y': escribe_a ( a, n ); break;
case 'b': bubbl ( a, n ); break;
case 's': selec ( a, n ); break;
case 'i': inser ( a, n ); break;
case 'q': quick ( a, n, 0, n - 1 ); break;
case 'z': corriendo = 0; break;
default: corriendo = 1; break;
}
}
}
// Declaracion de los voids
void inicializa ( int a [ 100 ], int *n )
{
*n = 3;
a [ 0 ] = 0;
a [ 1 ] = 1;
a [ 2 ] = 2;
}
void menu ( char *opcion )
{
clrscr();
cout << endl << "n lectura de n elementos ";
cout << endl << "x lectura de x elementos ";
cout << endl << "r lectura de n elementos al azar ";
cout << endl << "f lectura de n elementos por archivo";
cout << endl;
cout << endl << "e escritura del arreglo sin ordenar";
cout << endl << "y escritura del arreglo ya ordenado";
cout << endl;
cout << endl << "b ordenamiento burbuja ";
cout << endl << "q ordenamiento quick ";
cout << endl << "s ordenamiento seleccion o intercambio";
cout << endl << "i ordenamiento inserci¢n o corrimiento";
cout << endl;
cout << endl << "z alir ";
cout << endl;
cout << endl << "Opcion: ";
*opcion = getche();
*opcion = tolower ( *opcion );
}
void lee_n_a ( int a [ 100 ], int *n )
{
int k = 0;
int z;
clrscr ();
cout << endl << "Dame n: "; cin >> *n;
while ( k <= *n - 1 )
{
cout << endl << "Dame a [ " << k << " ]: "; cin >> z;
a [ k ] = z;
k++;
}
}
void lee_x_a ( int a [ 100 ], int *n )
{
char resp;
int k;
int z;
clrscr ();
k = -1;
cout << endl << "Desea Leer Datos ( s / n ): ";
resp = getche ();
resp = tolower ( resp );
while ( resp == 's' )
{
k++;
cout << endl << "Dame a [ " << k << " ]: "; cin >> z;
a [ k ] = z;
cout << endl << "Desea Seguir Leyendo Datos ( s / n ): ";
resp = getche ();
resp = tolower ( resp );
}
*n = k + 1;
}
void lee_r_a ( int a [ 100 ], int *n )
{
int k = 0;
clrscr ();
cout << endl << "Dame n: "; cin >> *n;
randomize ();
while ( k <= *n - 1 )
{
a [ k ] = random ( 100 );
k++;
}
}
void lee_f_a ( int a [ 100 ], int *n )
{
int z;
int k = -1;
int leyendo;
FILE *archivo;
if ( ( archivo = fopen ( "C:\\CUADERNO\\C4Q15.CPP", "r+" ) ) == NULL )
{
cout << endl << "Archivo no Existe!";
}
else
{
leyendo = 1;
while ( leyendo == 1 )
{
if ( ! ( feof ( archivo ) ) )
{
k++;
leyendo = 1;
fscanf ( archivo, "%d\n", &z );
a [ k ] = z;
}
else
{
leyendo = 0;
*n = k + 1;
}
}
cout << endl << "n: " << *n;
getch();
fclose ( archivo );
}
}
void duplica_a ( int a [ 100 ], int b [ 100 ], int n )
{
int k;
k = 0;
while ( k <= n - 1 )
{
b [ k ] = a [ k ];
k++;
}
}
void escribe_a ( int a [ 100 ], int n )
{
clrscr ();
int k = 0;
while ( k <= n - 1 )
{
cout << endl << "a [ " << k << " ] = " << a [ k ];
k++;
}
cout << endl << "n = " << n;
getch ();
}
void bubbl ( int a [ 100 ], int n )
{
int j;
int k;
j = 0;
while ( j <= n - 2 )
{
k = 0;
while ( k <= n - 2 )
{
if ( a [ k ] > a [ k + 1 ] )
{
intercambia ( &a [ k ], &a [ k + 1 ] );
}
k++;
}
j++;
}
}
void selec ( int a [ 100 ], int n )
{
int k;
int lugar;
k = 0;
while ( k <= n - 1 )
{
buscachico ( a, k, n - 1, &lugar );
if ( lugar == k )
{ // No hay Intercambio;
}
else
{
intercambia ( &a [ k ], &a [ lugar ] );
}
k++;
}
}
void inser ( int a [ 100 ], int n )
{
int k;
int lugar;
int chico;
k = 0;
while ( k <= n - 1 )
{
buscachico ( a, k, n - 1, &lugar );
if ( lugar == k )
{ // No hay Corrimiento;
}
else
{
chico = a [ lugar ];
recorre ( a, lugar, k + 1 );
a [ k ] = chico;
}
k++;
}
}
void quick ( int a [ 100 ], int n, int izq, int der )
{
int m;
if ( der <= izq )
{ // Termina Llamada Recursiva;
}
else
{ // Haciendo Particion;
partition ( a, n, izq, der, &m );
quick ( a, n, izq, m - 1 );
quick ( a, n, m + 1, der );
}
}
void partition ( int a [ 100 ], int n, int izq, int der, int *m )
{
int temp;
int bajo;
int alto;
temp = a [ izq ];
alto = der;
bajo = izq;
while ( bajo < alto )
{
while ( a [ bajo ] <= temp && bajo < alto )
{
bajo++;
}
while ( temp < a [ alto ] )
{
alto--;
}
if ( bajo < alto )
{
intercambia ( &a [ bajo ], &a [ alto ] );
}
}
a [ izq ] = a [ alto ];
a [ alto ] = temp;
*m = alto;
}
void recorre ( int a [ 100 ], int lugar, int kf )
{
int j;
j = lugar;
while ( kf <= j )
{
a [ j ] = a [ j - 1 ];
j--;
}
}
void buscachico ( int a [ 100 ], int k0, int kf, int *lugar )
{
int k;
int chico;
*lugar = k0;
chico = a [ k0 ];
k = k0;
while ( k <= kf )
{
if ( a [ k ] < chico )
{
chico = a [ k ];
*lugar = k;
}
k++;
}
}
void intercambia ( int *a, int *b )
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}