Está en la página 1de 12

ALGORITMOS Y

ESTRUCTURA DE DATOS

X



Algoritmos y Estructura DE Datos, Autor: Pablo Augusto Sznajdleder
Antes de comenzar
Este documento resume las principales operaciones que son generalmente utilizadas para la manipulacin de
arrays. Adems busca inducir al alumno para que descubra la necesidad de trabajar con tipos de datos ge-
nricos (implementados con templates) y tambin la importancia de poder desacoplar las porciones de cdigo
que son propias de un problema, de modo tal que el algoritmo pueda ser genrico e independiente de cual-
quier situacin particular, delegando dichas tareas en la invocacin de funciones que se reciben cmo pa-
rmetros (punteros a funciones).

Autor: Ing. Pablo Augusto Sznajdleder.
Revisores: Ing. Anala Mora, Martn Montenegro.
Operaciones sobre arrays
Agregar un elemento al final de un array
La siguiente funcin agrega el valor v al final del array ar r e incrementa su longitud.

void agr egar ( int ar r [ ] , int& l en, int v)
{
ar r [ l en] =v;
l en++;
return;
}

Recorrer y mostrar el contenido de un array
La siguiente funcin recorre el array ar r mostrando por consola el valor de cada uno de sus elementos.

void most r ar ( int ar r [ ] , int l en)
{
for( int i =0; i <l en; i ++)
{
cout << ar r [ i ] << endl;
}

return;
}

2
Determinar si un array contiene un determinado valor
La siguiente funcin permite determinar si el array ar r contiene o no al elemento v; retorna la posicin que
v ocupa dentro de ar r o un valor negativo si ar r no contiene a v.

int buscar ( int ar r [ ] , int l en, int v)
{
int i =0;
while( i <l en && ar r [ i ] ! =v )
{
i ++;
}

return i <l en?i : - 1;
}

Eliminar el valor ubicado en una determinada posicin del array
La siguiente funcin elimina el valor que se encuentra en la posicin pos del array ar r , desplazando al i-
simo elemento hacia la posicin i-1, para todo valor de i>pos y i<l en.

void el i mi nar ( int ar r [ ] , int& l en, int pos)
{
for( int i =pos; i <l en- 1; i ++ )
{
ar r [ i ] =ar r [ i +1] ;
}

// decremento la longitud del array
l en- - ;

return;
}

Insertar un valor en una determinada posicin del array
La siguiente funcin inserta el valor v en la posicin pos del array ar r , desplazando al i-simo elemento
hacia la posicin i+1, para todo valor de i que verifique: i>=pos e i<l en.

void i nser t ar ( int ar r [ ] , int& l en, int v, int pos)
{
for( int i =l en- 1; i >=pos; i - - )
{
ar r [ i +1] =ar r [ i ] ;
}

// inserto el elemento e incremento la longitud del array
ar r [ pos] =v;
l en++;

return;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER


3

Insertar un valor respetando el orden del array
La siguiente funcin inserta el valor v en el array ar r , en la posicin que corresponda segn el criterio de
precedencia de los nmeros enteros. El array debe estar ordenado o vaco.

int i nser t ar Or denado( int ar r [ ] , int& l en, int v)
{
int i =0;

// recorro mientras no me pase de largo y mientras no encuentre lo que busco
while( i <l en && ar r [ i ] <=v )
{
i ++;
}

// inserto el elemento en la i-esima posicion del array
i nser t ar ( ar r , l en, v, i ) ; // invoco a la funcion insertar

// retorno la posicion en donde se inserto el elemento
return i ;
}


Ms adelante veremos como independizar el criterio de precedencia para lograr que la misma funcin sea
capz de insertar un valor respetando un criterio de precedencia diferente entre una y otra invocacin.
Insetar un valor respetando el orden del array, slo si an no lo contiene
La siguiente funcin busca el valor v en el array ar r ; si lo encuentra entonces asigna t r ue a enc y
retorna la posicin que v ocupa dentro de ar r . De lo contrario asigna f al se a enc, inserta a v en
ar r respetando el orden de los nmeros enteros y retorna la posicin en la que finalmente v qued ubicado.

int buscaEI nser t a( int ar r [ ] , int& l en, int v, bool& enc)
{
// busco el valor
int pos = buscar ( ar r , l en, v) ;

// determino si lo encontre o no
enc = pos>=0;

// si no lo encontre entonces lo inserto ordenado
if( ! enc )
{
pos = i nser t ar Or denado( ar r , l en, v) ;
}

// retorno la posicion en donde se encontro el elemento o en donde se inserto
return pos;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

4
Templates
Los templates permiten parametrizar los tipos de datos con los que trabajan las funciones, generando de este
modo verdaderas funciones genricas.
Generalizacin de las funciones agregar y mostrar

template <typename T>
void agr egar ( T ar r [ ] , int& l en, T v)
{
ar r [ l en] =v;
l en++;

return;
}

template <typename T>
void most r ar ( T ar r [ ] , int l en)
{
for( int i =0; i <l en; i ++)
{
cout << ar r [ i ] ;
cout << endl;
}

return;
}


Veamos como invocar a estas funciones genricas.

int mai n( )
{
// declaro un array de cadenas y su correspondiente longitud
string aSt r [ 10] ;
int l ens =0;

// trabajo con el array de cadenas
agr egar <string>( aSt r , l ens, " uno" ) ;
agr egar <string>( aSt r , l ens, " dos" ) ;
agr egar <string>( aSt r , l ens, " t r es" ) ;

// muestro el contenido del array
most r ar <string>( aSt r , l ens) ;

// declaro un array de enteros y su correspondiente longitud
int aI nt [ 10] ;
int l eni =0;

// trabajo con el array de enteros
agr egar <int>( aI nt , l eni , 1) ;
agr egar <int>( aI nt , l eni , 2) ;
agr egar <int>( aI nt , l eni , 3) ;

// muestro el contenido del array
most r ar <int>( aI nt , l eni ) ;

return 0;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER


5

Ordenamiento
La siguiente funcin ordena el array ar r de tipo T siempre y cuando dicho tipo especifique el criterio de
precedencia de sus elementos mediante los operadores relacionales > y <. Algunos tipos (y/o clases) vlidos
son: i nt , l ong, shor t , f l oat , doubl e, char y st r i ng.

template <typename T>
void or denar ( T ar r [ ] , int l en)
{
bool or denado=false;
while( ! or denado)
{
or denado = true;
for( int i =0; i <l en- 1; i ++)
{
if( ar r [ i ] >ar r [ i +1] )
{
T aux = ar r [ i ] ;
ar r [ i ] = ar r [ i +1] ;
ar r [ i +1] = aux;
or denado = false;
}
}
}

return;
}

Punteros a funciones
Las funciones pueden ser pasadas cmo parmetros a otras funciones para que stas las invoquen.
Utilizaremos esta carcteristica de los lenguajes de programacin para parametrizar el criterio de precedencia
que queremos que la funcin or denar aplique al momento de comparar cada par de elementos del array ar r .
Observemos con atencin el tercer parmetro que recibe la funcin or denar . Corresponde a una funcin que
retorna un valor de tipo i nt y recibe dos parmetros de tipo T, siendo T un tipo de datos genrico
parametrizado por el template.
La funcin cr i t er i o, que debemos desarrollar por separado, debe comparar dos elementos e1 y e2, ambos de
tipo T, y retornar un valor: negativo, positivo o cero segn se sea: e1<e2, e1>e2 o e1=e2 respectivamente.

template <typename T>
void or denar ( T ar r [ ] , int l en, int ( *cr i t er i o) ( T, T) )
{
bool or denado=false;
while( ! or denado)
{
or denado=true;
for( int i =0; i <l en- 1; i ++)
{
// invocamos a la funcion para determinar si corresponde o no permutar
if( cr i t er i o( ar r [ i ] , ar r [ i +1] ) >0 )
{
T aux = ar r [ i ] ;
ar r [ i ] = ar r [ i +1] ;
ar r [ i +1] = aux;
or denado = false;

}
}
}
return;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

6
Ordenar arrays de diferentes tipos de datos con diferentes criterios de ordenamiento
A continuacin analizaremos algunas funciones que comparan pares de valores (ambos del mismo tipo) y
determinan cual de esos valores debe preceder al otro.
Comparar cadenas, criterio alfabtico ascendente:

int cr i t er i oAZ( string e1, string e2)
{
return e1>e2?1: e1<e2?- 1: 0;
}


Comparar cadenas, criterio alfabtico descendente:

int cr i t er i oZA( string e1, string e2)
{
return e2>e1?1: e2<e1?- 1: 0;
}


Comparar enteros, criterio numrico ascendente:

int cr i t er i o09( int e1, int e2)
{
return e1- e2;
}


Comparar enteros, criterio numrico descendente:

int cr i t er i o90( int e1, int e2)
{
return e2- e1;
}


Probamos lo anterior:

int mai n( )
{
int l en = 6;

// un array con 6 cadenas
string x[ ] = {" Pabl o" , " Pedr o" , " Andr es" , " J uan" , " Zamuel " , " Or oni o" };

// ordeno ascendentemente pasando como parametro la funcion criterioAZ
or denar <string>( x, l en, cr i t er i oAZ) ;
most r ar <string>( x, l en) ;

// ordeno descendentemente pasando como parametro la funcion criterioZA
or denar <string>( x, l en, cr i t er i oZA) ;
most r ar <string>( x, l en) ;







ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER


7


// un array con 6 enteros
int y[ ] = {4, 1, 7, 2, 8, 3};

// ordeno ascendentemente pasando como parametro la funcion criterio09
or denar <int>( y, l en, cr i t er i o09) ;
most r ar <int>( y, l en) ;

// ordeno ascendentemente pasando como parametro la funcion criterio90
or denar <int>( y, l en, cr i t er i o90) ;
most r ar <int>( y, l en) ;

return 0;
}

Arrays de estructuras
Trabajaremos con la siguiente estructura:

struct Al umno
{
int l egaj o;
string nombr e;
int not a;
};

// esta funcion nos permitira "crear alumnos" facilmente
Al umno cr ear Al umno( int l e, string nom, int not a)
{
Al umno a;
a. l egaj o = l e;
a. nombr e = nom;
a. not a = not a;

return a;
}

Mostrar arrays de estructuras
La funcin most r ar que analizamos ms arriba no puede operar con arrays de estructuras porque el objeto
cout no sabe cmo mostrar elementos cuyos tipos de datos fueron definidos por el programador. Entonces
recibiremos cmo parmetro una funcin que ser la encargada de mostrar dichos elementos por consola.

template <typename T>
void most r ar ( T ar r [ ] , int l en, void ( *most r ar Fi l a) ( T) )
{
for( int i =0; i <l en; i ++)
{
most r ar Fi l a( ar r [ i ] ) ;
}

return;
}


Probemos la funcin anterior:

// desarrollamos una funcion que muestre por consola los valores de una estructura
void most r ar Al umno( Al umno a)
{
cout << a. l egaj o << " , " << a. nombr e << " , " << a. not a << endl;
}

ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

8

int mai n( )
{
Al umno ar r [ 6] ;

ar r [ 0] = cr ear Al umno( 30, " J uan" , 5) ;
ar r [ 1] = cr ear Al umno( 10, " Pedr o" , 8) ;
ar r [ 2] = cr ear Al umno( 20, " Car l os" , 7) ;
ar r [ 3] = cr ear Al umno( 60, " Pedr o" , 10) ;
ar r [ 4] = cr ear Al umno( 40, " Al ber t o" , 2) ;
ar r [ 5] = cr ear Al umno( 50, " Car l os" , 4) ;

int l en = 6;

// invoco a la funcion que muestra el array
most r ar <Al umno>( ar r , l en, most r ar Al umno) ;

return 0;
}

Ordenar arrays de estructuras, por diferentes criterios
Recordemos la funcin or denar :

template <typename T>
void or denar ( T ar r [ ] , int l en, int ( *cr i t er i o) ( T, T) )
{
bool or denado=false;
while( ! or denado)
{
or denado=true;
for( int i =0; i <l en- 1; i ++)
{
if( cr i t er i o( ar r [ i ] , ar r [ i +1] ) >0 )
{
T aux = ar r [ i ] ;
ar r [ i ] = ar r [ i +1] ;
ar r [ i +1] = aux;
or denado = false;
}
}
}

return;
}


Definimos diferentes criterios de precedencia de alumnos:
a1 precede a a2 si a1. l egaj o<a2. l egaj o:

int cr i t er i oAl umnoLegaj o( Al umno a1, Al umno a2)
{
return a1. l egaj o- a2. l egaj o;
}


a1 precede a a2 si a1. nombr e<a2. nombr e:

int cr i t er i oAl umnoNombr e( Al umno a1, Al umno a2)
{
return a1. nombr e<a2. nombr e?- 1: a1. nombr e>a2. nombr e?1: 0;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER


9

a1 precede a a2 si a1. nombr e<a2. nombr e. A igualdad de nombres entonces preceder el alumno que
tenga menor nmero de legajo:

int cr i t er i oAl umnoNomYLeg( Al umno a1, Al umno a2)
{
if( a1. nombr e == a2. nombr e )
{
return a1. l egaj o- a2. l egaj o;
}
else
{
return a1. nombr e<a2. nombr e?- 1: a1. nombr e>a2. nombr e?1: 0;
}
}


Ahora s, probemos los criterios anteriores con la funcin or denar .

int mai n( )
{
Al umno ar r [ 6] ;
ar r [ 0] = cr ear Al umno( 30, " J uan" , 5) ;
ar r [ 1] = cr ear Al umno( 10, " Pedr o" , 8) ;
ar r [ 2] = cr ear Al umno( 20, " Car l os" , 7) ;
ar r [ 3] = cr ear Al umno( 60, " Pedr o" , 10) ;
ar r [ 4] = cr ear Al umno( 40, " Al ber t o" , 2) ;
ar r [ 5] = cr ear Al umno( 50, " Car l os" , 4) ;

int l en = 6;

// ordeno por legajo
or denar <Al umno>( ar r , l en, cr i t er i oAl umnoLegaj o) ;
most r ar <Al umno>( ar r , l en, most r ar Al umno) ;

// ordeno por nombre
or denar <Al umno>( ar r , l en, cr i t er i oAl umnoNombr e) ;
most r ar <Al umno>( ar r , l en, most r ar Al umno) ;

// ordeno por nombre+legajo
or denar <Al umno>( ar r , l en, cr i t er i oAl umnoNomYLeg) ;
most r ar <Al umno>( ar r , l en, most r ar Al umno) ;

return 0;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

10
Resumen de plantillas
Funcin agr egar :
Descripcin: Agrega el valor v al final del array ar r e incrementa su longitud.

template <typename T>
void agr egar ( T ar r [ ] , int& l en, T v)
{
ar r [ l en] =v;
l en++;
return;
}

Funcin most r ar :
Descripcin: Muestra todos los elementos del array ar r .

template <typename T>
void most r ar ( T ar r [ ] , int l en, void ( *most r ar Fi l a) ( T) )
{
for( int i =0; i <l en; i ++)
{
most r ar Fi l a( ar r [ i ] ) ;
}

return;
}

Funcin buscar :
Descripcin: Busca la primer ocurrencia de v en ar r ; retorna su posicin o un valor negativo si ar r no
contiene a v.

template <typename T, typename K>
int buscar ( T ar r [ ] , int l en, K v, int ( *cr i t er i o) ( T, K) )
{
int i =0;
while( i <l en && cr i t er i o( ar r [ i ] , v) ! =0 )
{
i ++;
}
return i <l en?i : - 1;
}

Funcin el i mi nar :
Descripcin: Elimina el valor ubicado en la posicin pos del array ar r , decrementando su longitud.

template <typename T>
void el i mi nar ( T ar r [ ] , int& l en, int pos)
{
int i =0;
for( int i =pos; i <l en- 1; i ++ )
{
ar r [ i ] =ar r [ i +1] ;
}
l en- - ;
return;
}
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER


11

Funcin i nser t ar :
Descripcin: Inserta el valor v en la posicin pos del array ar r , incrementando su longitud.

template <typename T>
void i nser t ar ( T ar r [ ] , int& l en, T v, int pos)
{
for( int i =l en- 1; i >=pos; i - - )
{
ar r [ i +1] =ar r [ i ] ;
}

ar r [ pos] =v;
l en++;
return;
}


Funcin i nser t ar Or denado:
Descripcin: Inserta el valor v en el array ar r en la posicin que corresponda segn el criterio cr i t er i o.

template <typename T>
int i nser t ar Or denado( T ar r [ ] , int& l en, T v, int ( *cr i t er i o) ( T, T) )
{
int i =0;
while( i <l en && cr i t er i o( ar r [ i ] , v) <=0 )
{
i ++;
}

i nser t ar <T>( ar r , l en, v, i ) ;

return i ;
}


Funcin buscaEI nser t a:
Descripcin: Busca el valor v en el array ar r ; si lo encuentra entonces retorna su posicin y asigna t r ue al
parmetro enc. De lo contrario lo inserta donde corresponda segn el criterio cr i t er i o, asigna f al se al
parmetro enc y retorna la posicin en donde finalmente qued ubicado el nuevo valor.

template <typename T>
int buscaEI nser t a( T ar r [ ] , int& l en, T v, bool& enc, int ( *cr i t er i o) ( T, T) )
{
// busco el valor
int pos = buscar <T, T>( ar r , l en, v, cr i t er i o) ;

// determino si lo encontre o no
enc = pos>=0;

// si no lo encontre entonces lo inserto ordenado
if( ! enc )
{
pos = i nser t ar Or denado<T>( ar r , l en, v, cr i t er i o) ;
}

return pos;
}

ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

12
ALGORITMOS Y ESTRUCTURA DE DATOS, AUTOR: PABLO AUGUSTO SZNAJDLEDER

Funcin or denar .
Descripcin: Ordena el array ar r segn el criterio de precedencia que indica la funcin cr i t er i o.

template <typename T>
void or denar ( T ar r [ ] , int l en, int ( *cr i t er i o) ( T, T) )
{
bool or denado=false;
while( ! or denado)
{
or denado=true;
for( int i =0; i <l en- 1; i ++)
{
if( cr i t er i o( ar r [ i ] , ar r [ i +1] ) >0 )
{
T aux = ar r [ i ] ;
ar r [ i ] = ar r [ i +1] ;
ar r [ i +1] = aux;
or denado = false;
}
}
}

return;
}


Funcin busquedaBi nar i a:
Descripcin: Busca el elemento v en el array ar r que debe estar ordenado segn el criterio cr i t er i o.
Retorna la posicin en donde se encuentra el elemento o donde este debera ser insertado.

template<typename T, typename K>
int busquedaBi nar i a( T a[ ] , int l en, K v, int ( *cr i t er i o) ( T, K) , bool& enc)
{
int i =0;
int j =l en- 1;
int k=( i +j ) / 2;

false; enc=
while( ! enc && i <=j )
{
if( cr i t er i o( a[ k] , v) >0 )
{
j =k- 1;
}
else
{
if( cr i t er i o( a[ k] , v) <0 )
{
i =k+1;
}
else
{
enc=true;
}
}
k=( i +j ) / 2;
}
return cr i t er i o( a[ k] , v) >=0?k: k+1;
}

También podría gustarte