Sunteți pe pagina 1din 13

Computacin

Tema 3 Diseo de algoritmos usando tipos de datos estructurados homogneos

Estructura de datos.
En computacin, una estructura de datos es una manera organizada de almacenar
informacin (datos) en un computador de modo que puedan ser usados de una forma
eficiente.
Una seleccin cuidadosa de la estructura permitir
usar un algoritmo ms eficiente.
Una estructura bien diseada permitir efectuar
una variedad de operaciones, usando un mnimo de
tiempo de ejecucin y espacio de memoria. A la
derecha se muestran los tipos de datos mas
utilizados.

Arreglos Unidimensionales N Dimensionales.


Un arreglo (array) es una coleccin de datos del mismo tipo, que se almacenan en
posiciones consecutivas de memoria y reciben un nombre comn. Para referirse a un
determinado elemento de un array se usa un ndice, que indique su posicin relativa en la
estructura.

Declaracin y Definicion.

Utilizando un lenguaje formal, se puede decir que una declaracin es una sentencia o
instruccin que introduce un nombre de variable (identificador) en un programa. A partir de
ese momento se dice que esa variable existe" dentro del programa.

La declaracin se completa con la definicin. En esta fase se concreta la creacin de la


entidad. Si es un dato se le asigna memoria fsica y pudiera ser inicializado.
La forma general de declaracin de arreglos es indicando el tipo de dato que va a almacenar,
el nombre del arreglo y el tamao:

Tipo se refiere al dato que van a ser almacenado (int, float, char, etc).

NombreArreglo permite identificar el arreglo y usualmente tiene ciertos requisitos del


lenguaje de programacin. Estos requisitos pueden ser una longitud mxima del nombre,
caracteres permitidos, palabras reservadas, etc.
Tamao indica el nmero de elementos que contiene el arreglo. En lenguaje C, este
valor debe ser una constante entera y no puede ser cambiado mientras el programa se
esta ejecutando. Este parmetro se debe incluir por cada dimensin del arreglo. En los
arreglos de una dimensin (vectores, listas) se coloca una vez. En los arreglos de dos

Diseo de algoritmos usando datos homogeneos

Computacin

dimensiones se coloca dos veces y en general para un arreglo de n dimensiones se


coloca n veces.

Dimension.
Existen arreglos de 1,2,3, , n dimensiones. La
forma general de la declaracin de un arreglo de
ms de una dimensin es:
Pseudoc
Tipo NombreArreglo[T1, T2, T n]
C++

Tipo NombreArreglo[T1][T2] [Tn];


Ejemplo: Definir las estructuras de datos para almacenar los datos de las evaluaciones (3)
de un conjunto de estudiantes (12) almacenadas en una tabla como se muestra abajo.
Debido a que los tipos de dato son diferentes ya que la
cedula es de tipo entero y las notas son del tipo real no
se puede guardar todo en una sola estructura.
Entonces se pueden definir dos estructuras para
almacenar los datos:
Pseudoc
ent CEDULA[12]
real NOTAS[12,3]

C++
int CEDULA[12];
float NOTAS[12][3];

CEDULA es de una dimensin, NOTAS es de dos


dimensiones. En el arreglo de dos dimensiones el 1
valor representa las filas y el 2 valor las columnas.
A esta forma de organizar los datos se le llama "arreglos paralelos" ya que aunque se
guardan en dos estructuras separadas existe una relacin entre los dos arreglos, que debe
ser respetada en la lgica del programa que procesa los datos. O sea al estudiante de la fila
7 del arreglo CEDULA, por ejemplo, le corresponden las notas almacenadas en la fila 7 del
arreglo NOTAS.

Diseo de algoritmos usando datos homogeneos

Computacin

Si suponemos que tenemos las notas por


materias (3) se puede organizar los datos
usando un arreglo de tres dimensiones
para
almacenar
los
datos
de
las
evaluaciones:
Pseudoc
ent CEDULA[12]
real NOTAS[12,3,3]
C++
int CEDULA[12];
float NOTAS[12][3][3];
Si se hace una analoga con las tres
dimensiones espaciales se podra decir que
el largo son las filas (1 ndice), el ancho
serian las columnas (2 ndice) y la tercera
dimensin sera la profundidad (3 ndice)

REFERENCIAS.Una vez que se declara un arreglo en un programa empieza a "existir" como una estructura
de datos, por lo que podemos comenzar a utilizarlo o a hacer referencias a l dentro de las
instrucciones del programa. Podemos leerlo, mostrarlo, copiarlo, modificar uno, dos o todos
sus elementos, etc. Para hacer una referencia a un arreglo se usa el siguiente formato:

NombreArreglo[ Indice ]
Donde:
NombreArreglo corresponde al identificador con el cual fue declarado
el arreglo.
Indice corresponde a la posicin de un elemento dentro del arreglo.
Este valor puede ser una constante de tipo entero, una variable de tipo
entero o inclusive una expresin que al evaluarse produce un resultado
de tipo entero.
El valor del ndice no puede ser mayor al tamao del arreglo porque se
estara intentando referenciar un elemento fuera de la estructura.
En C++ el ndice comienza en 0 por lo tanto en el arreglo
CEDULA
los elementos van de CEDULA[0] a CEDULA[11]. C++ no controla los
lmites del arreglo, es el programador quien debe incluir las
instrucciones necesarias dentro del programa para que no haya
desbordamiento.
Ejemplo:
CEDULA[6]
CEDULA[I]
CEDULA[2*I+1]

// se refiere al 6 elemento del arreglo


// la referencia depende del valor de I
//Se resuelve la expresin, para hacer la referencia

En el caso de arreglos de dos dimensiones se tiene:

NombreArreglo[ Indice1, Indice2 ]

Diseo de algoritmos usando datos homogeneos

Computacin

Donde:
Indice1 corresponde a la FILA del elemento referenciado.
Indice2 corresponde
referenciado.

la

COLUMNA

del

elemento

Estos dos ndices tienen las mismas propiedades


requerimientos de los arreglos de una dimensin.

Ejemplo:
NOTAS[6][1]

//Se refiere al elemento ubicado


//en la fila 6, columna 1

NOTAS[I][J]

//La referencia depende de los


//valores de I y J

ALMACENAMIENTO DE ARREGLOS EN MEMORIA.


La memoria de la computadora es unidimensional
por
lo
que
el
almacenamiento
de
los
arreglos de ms de una
dimensin requiere que la
posicin de los elementos
del
arreglo
sea
linealizada".
En el caso de una dimensin
hay una correspondencia
directa entre la posicin del
elemento en la memoria y
la posicin en la representacin real del vector. En
el caso de dos dimensiones
la matriz se almacena por
filas como se muestra en la
figura.
La posicin relativa en la memoria, de un elemento NOTAS[i,j] (Fila=i, Columna=j) del
arreglo NOTAS, con relacin al primer elemento es: P = n*(i-1) + j donde:

n: # columnas del arreglo,

i: fila del elemento

j: columna del elemento

Por ejemplo si deseamos saber la posicin, en la memoria, del elemento


arreglo; se aplicara la formula anterior:

n=3

i=2, j=3

P=3*(21)+3=6

NOTAS[2,3] del

NOTAS[2,3] ocupa la posicin 6 en memoria

Cardinalidad.Se refiere a la cantidad de elementos que tiene un arreglo. En tiempo de diseo, al


momento de declarar y definir el tamao de un arreglo, la mayora de las veces no se
conoce la cantidad de elementos que debe tener, por lo que se estima un valor y se chequea
dentro del algoritmo este valor, para evitar problemas en la ejecucin del algoritmo.
Diseo de algoritmos usando datos homogeneos

Computacin

En tiempo de ejecucin, existe una funcin sizeof(NombreArreglo) que devuelve el


tamao, en bytes, del arreglo. As por ejemplo si se hace:

cout<<sizeof(NOTAS);
se muestra en pantalla el valor 144, ya que el arreglo tiene 36 elementos y cada elemento
ocupa 4 bytes, si se desea mostrar la cantidad de elementos que tiene el arreglo se hace:

cout<<sizeof(NOTAS)/ sizeof(float);
Cadenas de Caracteres.Un tipo muy comn de datos es el texto (tipo char) el cual se usa normalmente en
paquetes o bloques (Nombres, Direcciones, Mensajes, etc) por lo que se requiere una
estructura para almacenarlo. Un vector tipo char permite almacenar un mensaje por
ejemplo:
1

1
0

1
1

1
2

1
3

14

Si se desea almacenar nombres por ejemplo, existe una amplia variedad de longitudes,
como por ejemplo, Ana Paz o Francisco Fernndez; y como es necesario especificar el
tamao para declarar el arreglo, entonces se coloca un tamao estimado, por ejemplo

NOMBRE[20];

1 2 3 4 5 6 7 8 9
A N A

1
0
P A Z & % 4

1
1
V

1
2
K

1
3
?

1
4
#

1
5
@

1
6
)

1
7

1
8
8

1
9

2
0
(

El espacio reservado se ocupa con un nombre, ANA PAZ por ejemplo, y el resto queda con
cualquier cosa &%4VK?....., que no es til. Para facilitar el manejo de la informacin
almacenada de esta manera se agrega una separacin entre la informacin que es til y la
que no lo es, esta separacin es el fin de cadena, un carcter especial que se escribe '\0'.
1 2 3 4 5 6 7 8
A N A

P A Z \
0

1
0
% 4

1
1
V

1
2
K

1
3
?

1
4
#

1
5
@

1
6
)

1
7

1
8
8

1
9

2
0
(

El dato almacenado de esta manera se le llama una cadena de caracteres (string), si no


tiene fin de cadena es simplemente un arreglo de caracteres.
Tambin es frecuente la necesidad de almacenar arreglos de cadenas de caracteres, por
ejemplo una lista de nombres, una lista de direcciones, una lista de mensajes.
A la derecha se muestra una lista de nombres,
donde cada nombre tiene diferente longitud.
Cada nombre se guarda en un vector, pero
como la lista es una estructura, se requiere integrar todos los vectores en una sola estructura, as se llega a un arreglo Lista[5][10].

10

&

\
0
L

2
3

F
J

R
U

A
A

N
N

C
A

C
)

\0
8

I
\
0
A

\
0
S
@

Diseo de algoritmos usando datos homogeneos

\
0

Computacin

LISTA[5][10] es una estructura de dos dimensiones donde el primer ndice representa las
filas o cantidad de elementos de la lista y el segundo ndice representa el ancho mximo o
cantidad mxima de caracteres que debe tener cada nombre, incluyendo el fin de cadena.

Operaciones sobre arreglos.


1.

R 2. Asignacin

3.

ecorrido

Lectura /
Escritura

4.

Ordenacin
Bsqueda.

RECORRIDO
Para utilizar la informacin almacenada en arreglos
es necesario recorrer el arreglo. El recorrido puede
incluir todo o parte del arreglo. La operacin se
realiza usando estructuras cclicas, relacionando
variables de control con los ndices del arreglo. De
esta manera se pueden hacer acciones (leer,
mostrar, asignar valores, etc) sobre los elementos
referenciados con el indice I.

repetir_desde(I=1,I<=N,I=I+1)
Accin sobre ARREGLO[I]
fin_repetir_desde

Recorrido caso una dimensin.El diseo del recorrido depende del


enunciado del problema a resolver, o sea
que no existe una receta para recorrer un
arreglo o vector.
Un vector declarado como int A[12]
pudiera ser recorrido todo, desde el inicio al
final, tambin pudiera recorrerse por
posiciones impares o por posiciones pares
Ejemplo 1: Recorrer un vector P[10].
Usando ciclos con contador
algoritmo RecorreVector_P
inicio
ent P[10], I
repetir_desde(I=1,I<=10,I=I+1)
Accion_sobre P[I]
fin_repetir_desde
fin
Usando ciclos con condicin
algoritmo RecorreVector_P
inicio
ent P[10], I=1
repetir_mientras (I 10)
Accion_sobre sobre P[I]
I=I+1
fin_repetir_mientras
fin
algoritmo RecorreVector_P
inicio
ent P[10], I=1
repetir
Accion_sobre sobre P[I]
I=I+1

void main(void)
{ int P[10],I ;
for(I=0 ;I<10 ;I++ )
{ Accion_sobre sobre P[I];
}
}
void main(void)
{ int P[10],I ;
I=0;
while(I<10)
{ Accion_sobre sobre P[I];
I++;
}
}
void main(void)
{ int P[10],I ;
I=0;
do
{ Accion_sobre sobre P[I];
I++;

Diseo de algoritmos usando datos homogeneos

Computacin

mientras(I < 10)


fin

}while(I<10) ;

Recorrido caso dos dimensiones.El recorrido de un arreglo de dos dimensiones tiene ms posibilidades. Un arreglo declarado
como int A[3][3]; se podra recorrer por filas, por columnas o por diagonales, como se
muestra en la figura de la pagina siguiente. Estas no son las nicas posibilidades, y al igual
del caso unidimensional el diseo del recorrido depende del enunciado del problema.
El recorrido de un arreglo de dos dimensiones
requiere el uso de un lazo doble (anidado).
repetir_desde(I=1,I<= N,I=I+1)
repetir_desde(J=1,J<=M,J=J+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde

Recorrido por FILAS


I J
repetir_desde(I=1,I<=N,I=Ii+1)
1 1

A[I][J]
A[1][1]

repetir_desde(J=1,J<=M,J=J+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde

A[1][2]

A[1][3]

N=FILAS
M=COLUMNAS

A[2][1]

Recorrido por COLUMNAS


I J
repetir_desde(J=1,J<=M,J=J+1)
1 1

repetir_desde(I=1,I<=N,I=I+1)
Accion_sobre A[I,J]
fin_repetir_desde
fin_repetir_desde

N=COLUMNAS
M=FILAS

A[2][2]

A[2][3]

A[3][1]

A[3][1]

A[3][3]

for(I=0;I<FILAS;I++)
{ for(J=0;J<COLUMNAS;J++)
{
Accion_sobre A[I,J]
}
}

A[I][J]
A[1]
[1]
A[2]
[1]
A[3]
[1]
A[1]
[2]
A[2]
[2]
A[3]
[2]
A[1]
[3]
A[2]
[3]
A[3]
[3]

for(I=0;I<COLUMNAS;I++)
{ for(J=0;J<FILAS;J++)
{
Accion_sobre A[J,I]
}
}

ASIGNACION.La asignacin de valores a un elemento de un arreglo se representa con el operador "=":


En Pseudoc: A[10] = 3, ventas[2,2] = 1500

En C++: A[10]=3;, ventas[2][2] = 1500;

La asignacin de valores a los elementos de un arreglo se puede hacer:


En forma individual:

Usando una estructura cclica:


ent B[10]

Diseo de algoritmos usando datos homogeneos

Computacin
float A[6];
A[0]=10.8; A[1]=12; A[2]=17.5;
A[3]=15.1; A[4]=14; A[5]=16;

8
repetir_desde(i=1,i<=10,i=i+1)
B[i] = 0
fin_ repetir_desde

En el caso de una cadena de caracteres:


En forma individual:

Asignando la cadena completa

car nombre[15]
nombre[1]='C'; nombre[2]='A'; nombre[3]='R';
nombre[4]='M'; nombre[5]='E'; nombre[6]='N';
nombre[7]='\0';

En pseudocdigo: nombre="CARMEN"
En C++: strcpy(nombre,"CARMEN")
strcpy funcin de la librera <string.h>

El valor asignado puede ser:


un valor constante

una variable o expresin

repetir_desde(i=1, i<=10,i=i+1)
A[i] = 0
fin_ repetir_desde
lo que devuelve una funcin

repetir_desde(i=1, i<=10,i=i+1)
A[i] = 2*i+i^2
fin_ repetir_desde
valor leido del teclado

repetir_desde(i=1, i<=10,i=i+1)
A[i] = random(10)
fin_ repetir_desde

repetir_desde(i=1, i<=10,i=i+1)
leer (A[i])
fin_ repetir_desde

Otro elemento del arreglo


repetir_desde(i=1, i<=9,i=i+1)
A[i] = A[i+1]
fin_ repetir_desde

Si se desea asignar valores a todos los elementos de un vector, se debe recorrer el vector y
efectuar la operacin de asignacin con cada uno de los elementos del vector.

Caso Unidimensional. Asignar el valor 6 a


todos los elementos de un vector A[5]

repetir_desde(i=1, i<=5,i=i+1)
A[i] = 6
fin_repetir_desde

Caso MD. Inicializar un vector B[2,3] con el


valor cero.
repetir_desde(i=1, i<=2,i=i+1)
repetir_desde(j=1,j<=3,j=j+1)
B[i,j] = 0
fin_repetir_desde
fin_repetir_desde

INICIALIZACION DE ARREGLOS.C permite la inicializacin de arreglos al momento de declararlos usando la forma general:
Tipo NombreArreglo [T1][T2][Tn]={Lista_de_valores};
La lista de valores es una lista de constantes separadas por comas cuyo tipo debe ser
compatible con el Tipo definido para el arreglo.
float NOTAS[6]={10.8,12,17.5,15.1,14,16};
1
2 3
4
5 6
Esto es equivalente a hacer:
float NOTAS[6];
NOTAS[0]=10.8; NOTAS[1]=12; NOTAS[2]=17.5; NOTAS[3]=15.1; NOTAS[4]=14; NOTAS[5]=16;

Diseo de algoritmos usando datos homogeneos

Computacin

Esta permitido, solo en la declaracin, dejar en blanco el tamao del arreglo en el momento
de la inicializacion. El tamao se asigna automticamente a la cantidad de elementos
inicializados
int A[ ]={1,8,8,9,4,3,2,5,4,7};
Las siguientes declaraciones muestran como inicializar una cadena de caracteres
char
char
char
char

RIO[12]="ORINOCO";
RIO[12]={'O','R','I','N','O','C','O'};
RIO[12]={'O','R','I','N','O','C','O','\0'};
RIO[ ]="ORINOCO";

//Arreglo de caracteres
//Cadena de caracteres
//cadena de caracteres

Es importante diferenciar el uso de las comillas simples (') y las comillas dobles ("). La
comilla simple se usa cuando se maneja UN SOLO CARCTER, como por ejemplo 'A', 'L', 'm'.
Cuando se quiere especificar una cadena de caracteres se usa comilla doble por ejemplo
"ORINOCO".
'A'

Especifica el carcter A que se guarda en un byte

"A"

Especifica una cadena A que se guarda en dos bytes, A + \0

Inicializacin de un arreglo de dos dimensiones. Cualquiera de estas formas es valida


int A[3][5]={10,12,12,17,15,11,16,16,4,11,8,10,15,33,6};
int A[3][5]={{10,12,12,17,15},{11,16,16,4,11},{8,10,15,33,6}};
int A[3][5]={{10,12,12,17,15},
{11,16,16,4,11},
{8,10,15,33,6}};
Inicializacin de un arreglo de cadenas de caracteres.
char RIOS[5][12]={"ORINOCO","CARONI","APURE","GUAIRE","CAURA"};
char RIOS[ ][12]={"ORINOCO","CARONI","APURE","GUAIRE","CAURA"};
LECTURA / ESCRITURA
Esta operacin tiene la forma general:
En Pseudoc

En C++

leer(NombreArreglo[indice])
mostrar(NombreArreglo[indice])

cin>> NombreArreglo[indice];
cout<< NombreArreglo[indice];

Ejemplo 1:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void main()
{
int A[6],C[6],i;
int B[6]={2,3,6,77,12,8};
for(i=0;i<6;i++)
{
cin>>A[i];
C[i]=random(100);
}
for(i=0;i<6;i++)
{
cout<<setw(3)<<A[i]
<<setw(3)<<B[i]
<<setw(3)<<C[i]<<endl;
}
getch();

En el programa del ejemplo se declaran tres


vectores los cuales se cargan de tres maneras
diferentes, A se lee del teclado, B se inicializa en la
declararon y C se llena usando una funcin random.
Los tres vectores se muestran haciendo un recorrido
completo usando una estructura cclica. La salida del
programa es:

Diseo de algoritmos usando datos homogeneos

Computacin

10

Ejemplo 2:
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{ char RIO[12],MAYOR12];
int I,LARGO,MAX=0;
for(I=0;I<=5;I++)
{ cin>>RIO; cin>>LARGO;
if(LARGO>MAX)
{ MAX=LARGO;
strcpy(MAYOR,RIO);
}
}
cout<<"Rio mas largo: "<<MAYOR;
getch();
}

El programa del ejemplo lee los nombres de


5 rios junto con un valor (LARGO) que
representa su longitud. En el programa se
muestra como se lee un arreglo que
contiene una cadena de caracteres (RIO).
Se observa que la cadena de caracteres se
referencia completa (cin>>RIO) tanto en la
lectura
como
en
la
escritura
(cout<<MAYOR).
Se observa que la asignacin
MAS_LARGO = RIO debe hacerse en C++:

strcpy(MAYOR,RIO);

Ejemplo 3:
El ejemplo 3 muestra dos programas en los que se utilizan arreglos de dos dimensiones. El
de la izquierda lee/ muestra un arreglo A[3][5] de tipo entero. En este caso se debe recorrer
el arreglo completo utilizando dos estructuras cclicas anidadas. En el programa de la
derecha se lee una lista de rios (5), con una longitud mxima de 12 caracteres para cada
cadena. En este caso a pesar de que RIOS es un arreglo bidimensional, no es necesario leer
cada elemento, como en el caso numrico de la izquierda, ya que se lee cada cadena
completa.
void main()
{
int A[3][5],i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++
{
cin>>A[i][j];
}
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++
{
cout>>A[i][j];
}
}
getch();
}

void main()
{
char RIOS[5][12];
for(i=0;i<5;i++)
{
cin>>RIOS[i];
}
for(i=0;i<5;i++)
{
cout>>RIOS[i];
}
getch();
}

Diseo de algoritmos usando datos homogeneos

Computacin

11

Algoritmos bsicos de ordenamiento y bsqueda.


BUSQUEDA.- Esta operacin es una tarea muy comn en computacin y bsicamente
consiste en encontrar la posicin de un elemento especfico en un conjunto de elementos
dados.

Bsqueda secuencial
Suponemos una lista (vector) de elementos, donde no hay elementos repetidos, la forma
mas sencilla de buscar un elemento especifico es recorriendo la lista y verificando si existe
alguna coincidencia entre los elementos de la lista y el elemento buscado. Si existe el
elemento se muestra un mensaje Fin de bsqueda", en caso contrario mostrar Elemento
No Existe".
Ejemplo: Se desea buscar una cedula en una lista (100 valores), si se encuentra se
muestra un mensaje indicando que esta existe, en caso contrario se muestra un mensaje
indicando que existe. Se supone que no hay elementos repetidos.
Anlisis.- Se requiere recorrer toda la lista y preguntar si cada elemento de la lista es el
que estamos buscando. Se requiere un ciclo con contador (I desde 1 hasta 100) y una
estructura de decisin para confirmar la condicin del elemento buscado.
Diseo del algoritmo.El algoritmo de la izquierda muestra un mensaje indicando que la cedula existe y muestra su posicin
dentro de la lista. Si la cedula no existe el algoritmo no dice nada.
algoritmo bsqueda_secuencial
inicio
entero LISTA[100],I,B
repetir_desde I = 1 hasta I = 100
leer(LISTA[I])
fin_repetir_desde
leer (B)
repetir_desde(I=1, I<=100,I=I+1)
si LISTA(I) = B
mostrar(CEDULA EXISTE")
mostrar(Posicin = , I)
fin_si
fin_repetir_desde
fin
Para indicar cuando la cedula no existe", se
debe usar una variable tipo switch (flag),
como se muestra a la derecha:
Este algoritmo puede ser mejorado ya que, en
el anterior, aunque el encuentre el elemento
buscado sigue recorriendo la lista. Una forma
de evitar esto es usando un ciclo con
condicin.
Cuando se encuentra el elemento buscado se
interrumpe el ciclo de bsqueda y se
muestran los resultados.
algoritmo bsqueda_secuencial1
inicio
entero LISTA[100], I, B, flag
repetir_desde(I=1, I<=100,I=I+1)
leer(LISTA[I])

algoritmo bsqueda_secuencial
inicio
entero LISTA[100], I, B, flag
repetir_desde I = 1 hasta I = 100
leer(LISTA[I])
fin_repetir_desde
leer (B), flag = 0
// Cedula NO EXISTE
repetir_desde(I=1, I<=100,I=I+1)
si LISTA(I) = B
mostrar(CEDULA EXISTE")
mostrar(I = , I)
flag = 1
// Cedula SI EXISTE
fin_si
fin_repetir_desde
si flag = 0 entonces
mostrar(Cedula NO EXISTE")
fin_si
fin
leer (B)
I =1
repetir_mientras(I <= 100 && LISTA[I] != B)
I =I+1
fin_repetir_mientras
si LISTA(I) = B entonces
mostrar(CEDULA EXISTE")
mostrar(I = , I)
flag = 1
// Cedula SI EXISTE
si_no
mostrar(Cedula NO EXISTE")
fin_si
fin

Diseo de algoritmos usando datos homogeneos

Computacin

12

fin_repetir_desde

Bsqueda Menor / Mayor.El problema planteado es buscar el elemento menor/mayor de un conjunto de elementos
almacenados en un arreglo. Por ejemplo, buscar el elemento mayor del vector A mostrado:
A(1)

A(2)

A(3)

A(4)

A(5)

Anlisis.La estrategia a seguir consiste en asignar la


condicin deseada (MAYOR) al primer
elemento de la lista y se empieza a comparar
con todos los elementos de la lista. Si alguno
de los elementos resulta mayor que el
elemento al cual se le ha asignado la
condicin, se cambia la condicin al nuevo
elemento. Al terminar de recorrer todo el
vector, el valor que mantiene la condicin
deseada es el mayor.

Diseo del algoritmo:

algoritmo Bsqueda_Mayor
inicio
entero I, MAYOR, A [5]
repetir_desde(I=1, I<=5,I=I+1)
Leer (A[I])
fin_repetir_desde
I=1
MAYOR = A [I]
repetir_mientras I <= 5
si A[I] > MAYOR
MAYOR = A[I]
Fin_si
I=I+1
fin_repetir_mientras
mostrar(El valor Mayor es: , MAYOR)
fin

ORDENAMIENTO.Ordenar es simplemente organizar informacin de una manera especificada (criterio de


ordenamiento).
Mtodo de Intercambio o de burbuja:
El algoritmo se basa en el principio de comparar pares de elementos adyacentes e
intercambiarlos entre si hasta que estn todos ordenados.
Ejemplo: Se desea ordenar en forma
ascendente el vector A:
Los pasos a seguir son:
1. Comparar elementos adyacentes en parejas
(A[1] y A[2] - A[2] y A[3] - A[3] y A[4] . A[n-1] y A[n]). Si estn en el orden
deseado se dejan igual, en caso contrario se
intercambian las posiciones. Si el vector
tiene n elementos, se necesitan (n-1)
comparaciones para recorrer todo el vector.
2. Al finalizar un ciclo, el vector estar
parcialmente ordenado. Se debe repetir el
proceso hasta que el vector quede
totalmente ordenado. En el caso ms
desfavorable,
que
el
elemento
mas
pequeo/grande se encuentre en el extremo
opuesto al orden requerido, se requieren (n1) ciclos para llevarlo a su posicin correcta.

A(1)
5

A(2)
6

A(3)
3

A(4)
2

A(5)
1

algoritmo ordenar_burbuja
inicio
entero A[5], I, J, aux, N
N=5
repetir_desde(I=1, I<=N,I=I+1)
leer (A [I])
fin_repetir_desde
repetir_desde(I=1, I<=N-1,I=I+1)
repetir_desde(J=1,J<=N-1,J=J+1)
si A[J] > A[J+1]
aux = A[J]
A[J] = A[J+1]
A[J+1] = aux
fin_si
fin_repetir_desde
fin_repetir_desde
fin

El total de comparaciones para ordenar todo


el vector ser de
(n-1)*(n-1) = (n-1)2

Diseo de algoritmos usando datos homogeneos

Computacin

13

Para el ejemplo planteado N = 5 por


lo que se requieren 4 ciclos de 4 pasos
cada uno por lo tanto se requieren
(4x4) 16 comparaciones.
En la tabla se observa que al final de
cada ciclo, el elemento ubicado en el
extremo derecho ya queda ubicado en
su posicin definitiva y no es necesario
incluirlo en los chequeos posteriores.

El algoritmo
disminuyendo
necesarios:

se puede
el nmero

modificar
de ciclos

repetir_desde(I=1, I<=N-1,I=I+1)
repetir_desde(J=1,J<=N-I,J=J+1)
si A[J] > A[J+1]
aux = A[J]
A[J] = A[J+1]
A[J+1] = aux
fin_si
fin_repetir_desde
fin_repetir_desde

La tabla se reduce como se muestra


abajo

Diseo de algoritmos usando datos homogeneos

S-ar putea să vă placă și