Vous êtes sur la page 1sur 45

Lectura 3: Arreglos

Unidad 4: Estructura de Datos: Arreglos


4.1 Concepto de arreglo unidimensional

Una estructura de datos es una coleccin de datos organizados de una cierta manera, y que se
caracterizan por las operaciones que se definen sobre ellas.
Las estructuras de datos son muy importantes en los sistemas de computadora.
Las estructuras de datos se clasifican en estticas y dinmicas. Esta clasificacin se basa en la
forma de gestionar la memoria de sistema para almacenar un conjunto de elementos del mismo
tipo.
Las estructuras estticas, la memoria se gestiona en tiempo de compilacin, mientras que para las
estructuras dinmicas la memoria se gestiona en tiempo de ejecucin. La forma de generar los
almacenamientos implican ventajas y desventajas, ambos tipos de estructuras existen en los
lenguajes reales, el uso ms conveniente de una forma u otra depender de los requerimientos
del problema a resolver.
Dentro de las estructuras estticas, se encuentran los arreglos (cualquiera sea el nmero de
dimensiones que tenga) y los registros (estas son colecciones de elementos que pueden ser de
distinto tipo, los cuales se vern ms adelante).
Dentro de las estructuras dinmicas se encuentran: pila, cola, lista simplemente enlazada, lista
doblemente enlazada, listas circulares, rboles, grafos. En todas ellas, se almacena el dato
genuino 8 por ejemplo alturas de personas) ms otro tipo de informacin que ayuda a formar la
estructura de datos de una forma particular.
En programacin, un arreglo, es un conjunto finito de elementos del mismo tipo (homogneos)
que ocupa un espacio o zona de almacenamiento en memoria dinmica fsicamente contiguo.
Los arreglos pueden ser unidimensionales tambin llamados vectores (o arreglos lineales), o
bidireccionales (matrices) o multidimensionales.
Todo arreglo unidimensional o vector tiene asociado un nico nombre o identificador. Cada
elemento es referenciado por la posicin que ocupa dentro del vector. Dichas posiciones son
llamadas ndice y siempre son correlativos.
Los vectores se pueden representar grficamente como muestra la figura1, es decir como un
rectngulo dividido en tantas partes iguales como elementos tiene el vector o arreglo
unidimensional. La figura 1 representa un arreglo unidimensional llamado Dato de 4 elementos.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-1-

El nombre o identificador sirve para todos los elementos del conjunto, el valor del subndice
asociado identifica en forma precisa a alguno de esos elementos.

Dato [ 1]

Dato [ 2]

Dato [4]

Dato [3]

Figura 1

El nmero de elementos de un vector se llama rango del vector. En el caso de la figura 1, el rango
del vector llamado Dato, es 4.
Los arreglos en general pueden contener datos numricos y no numricos, por ejemplo se puede
pensar en un arreglo de carcter. La figura 2, muestra un arreglo de tipo carcter de 5 elementos,
llamado Info.

Info [ 1]

Info [ 2]

Info [3]

Info [4]

Info [5]

Figura 2

Otro ejemplo de un arreglo unidimensional no numrico, puede ser un vector que contiene los
nombres de los 8 alumnos de un curso, entonces el vector se llama Alumno y su rango es de 8.
En la figura 3 se muestra el vector Alumno.
Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una
posicin de memoria. Por ejemplo:
Dato [4] 3
Almacena el valor entero o real 3 en el vector Dato en la posicin nmero 4 (dato debe ser de tipo
entero o real).
La instruccin:
escribir (Dato [4])
muestra por pantalla el contenido de la posicin 4 del vector llamado Dato.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-2-

Los arreglos cualquiera sea su dimensin necesitan ser dimensionados previamente a su uso
dentro de un programa.

Alumno
Luis
Jose
Sonia
Pedro
Celeste
Toms
Sonia

Pedro

Figura 3

En pseudocdigo un arreglo unidimensional se declara de la siguiente forma:


Algoritmo declaracin_arreglo
tipo
array [1..10] de entero : dato
var
dato : info
entero: ndice
inicio
..
Se debe nota que en este trozo de cdigo se agrega una seccin llamada tipo, en esta parte se
declaran los arreglos y otros tipos de datos definidos por el usuario como se ver ms adelante.
Se usa la palabra reservada array, seguido entre corchetes el rango como un intervalo cerrado
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-3-

entre 1 y el lmite superior o cantidad mxima de elementos. En el ejemplo el arreglo tiene 10


elementos. A continuacin se indica el tipo de dato que contiene el arreglo y finalmente el
identificador. En la seccin correspondiente a las variables (var) se indica el nombre de la variable con la
que se va a manipular el conjunto de elementos. En el ejemplo el arreglo es de enteros y la variable por
media de la cual se va a acceder a los elementos del vector, es info.
Si se desea guardar el valor entero 5, en la segunda posicin del vector, la instruccin es:
info [2] 5
En el siguiente trozo de cdigo, se crean dos vectores distintos:
Algoritmo declaracin_arreglo2
tipo
array [1..10] de entero : dato
var
dato : origen, destino
entero: ndice
inicio
..
En este trozo de cdigo, se crean dos arreglos distintos, uno de ellos se trabaja mediante la
variable origen (arreglo unidimensional de 10 elementos de tipo entero) y otro se trabaja mediante
la variable destino (arreglo de 10 elementos de tipo entero).
En este ejemplo, dato es un tipo de dato definido por el usuario, as como entero, real, lgico son
tipos de datos primitivos o simples, dato es un tipo de dato compuesto, que reciben el nombre de:
tipo de dato definido por el usuario.
En un mismo algoritmo pueden declararse varios tipos de arreglos, segn las necesidades que
surjan de los requerimientos del problema a resolver, en el siguiente cdigo se declaran tres
arreglos distintos.
Algoritmo declaracin_arreglo3
tipo
array [1..10] de entero : dato
array [1..20] de real: vector1
array [1..3] de cadena: vector2
var
dato : origen
vector1: vec1
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-4-

vector2: vec2
entero: ndice
inicio
..

4.2 Utilizacin de arreglos unidimensionales en algoritmos

Los arreglos se utilizan cuando es necesario almacenar varios valores. Tambin se podran
guardar valores en un conjunto de variables simples, pero esto es ms engorroso, y ms complejo
de manejar. En lugar de tener 10 variables de tipo real para guardar las alturas de personas, es
ms sencillo crear un arreglo de 10 elementos de tipo real, ya que toda la informacin la manejo
con el mismo nombre de variable; y los elementos se diferencian entre s segn el valor que
asuma un subndice asociado al vector.
En la prctica suele ser necesario procesar conjuntos de datos, como por ejemplo listas de
alumnos, docentes, cuentas bancarias, etc. Por ejemplo si necesitase procesar datos de 5000
alumnos respecto al promedio de inasistencia de ellos, deberamos tener 5000 variables simple,
cada una de ellas contendra un entero que represente este dato (inasistencias). Si por ejemplo se
quisiese ordenar los alumnos por nmero creciente de inasistencias, para por ejemplo otorgarles
un premio, sera imperioso tener todos los datos activos en memoria, y necesitara otra variable
para indicar el orden de los datos (5000 variables enteras ms). Mientras que con un arreglo
unidimensional de 5000 elementos de tipo entero sera suficiente para contener los datos y una
variable ms de tipo entero para indicar el orden dentro del arreglo (subndice). Ordenado los
datos de menor a mayor, en la primer posicin del arreglo (ndice = 1) tendra la menor
inasistencia y en la ltima posicin tendra el nmero ms grande correspondiente al mayor
nmero de falta (ndice = 5000).
Como queda explicado con esta breve reflexin, es necesario que los lenguajes de programacin
brinden soporte para mantener juntos (referenciados mediante un mismo identificador)
colecciones de de datos del mismo tipo.

4.3 Manejo de ndices.


Un vector como ya se mencion es una secuencia ordenada de elementos como
x[1], x[2],,x[n]
El lmite inferior no tiene que empezar en 1, puede ser cualquier valor para el subndice, aunque
es ms fcil si el subndice tambin sirve para indicar posicin, como en el ejemplo anterior. Un
subndice igual a 1, tambin indica posicin 1, y as.
Entonces tambin sera vlido
P[0], P[1], P[2], P[3], P[4], P[5]
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-5-

En este caso el rango del arreglo P es 6, y la posicin 1 le corresponde el subndice 0.


Lo mismo sucede con el siguiente caso:
P[-10], P[-11], P[-12], P[-13], P[-14], P[-15]
En este caso el rango del arreglo P es 6, y la posicin 1 le corresponde el subndice -10 y as
sucesivamente.
Las operaciones que pueden realizarse con vectores son:

Asignacin
Lectura/escritura
Recorrido
Ordenacin bsqueda

En general, las operaciones con vectores implican el procesamiento o tratamiento de los


elementos individuales del arreglo lineal.
ASIGNACION
La asignacin de valores a un elemento del arreglo lineal se realiza con la siguiente instruccin:
A [4] 20
Si se desea asignara valores a todas las posiciones de un arreglo, desde el teclado, se deber
utilizar una estructura repetitiva, cualquiera. La que mejor se adapta es la estructura desde/findesde; ya que esta estructura tienen asociada a ella necesariamente una variable que permite
contar las iteraciones, esa variable es la que nos sirve de subndice.
Algoritmo almacena-valores_arreglo
tipo
array [1..10] de entero : dato
var
dato : origen
entero: ndice
inicio
escribir ( ingresar los 10 elementos del arreglo)
desde ndice 1 hasta 10 hacer
leer ( origen [ndice])
fin-desde
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-6-

..
..
En el trozo de cdigo anterior se declara un arreglo lineal de 10 elementos de tipo entero, la
variable para manejar la coleccin de datos se llama origen. La estructura repetitiva desde/findesde, itera 10 veces para asignar desde el teclado 10 valores enteros al arreglo, uno por cada
posicin del mismo.
LECTURA /ESCRITURA DE DATOS
Las operaciones de lectura y escritura de los elementos de un arreglo lineal generalmente se
realizan con estructuras repetitivas, aunque tambin pueden hacerse con estructuras selectivas
(depender de los requerimientos).

Si se desea mostrar por pantalla el contenido de una posicin de un arreglo se utilizar la


siguiente instruccin:
Mostrar ( a[2])
Esta instruccin muestra por pantalla el contenido de la posicin 2 (si el lmite inferior del arreglo
es 1) del arreglo lineal a.
Si se desea mostrar por pantalla el contenido de todo un arreglo se usar una estructura repetitiva
como se muestra en el siguiente trozo de cdigo:
Algoritmo declaracin_arreglo4
tipo
array [1..10] de entero : dato
var
dato : origen
entero: ndice
inicio
escribir ( ingresar los 10 elementos del arreglo)
desde ndice 1 hasta 10 hacer //se toman los valores del teclado
leer ( origen [ndice])
fin-desde
escribir ( Se muestran los elementos del arreglo lineal)
desde ndice 1 hasta 10 hacer // se muestran por pantalla los datos del arreglo lineal
escribir (origen [ndice])
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-7-

fin-desde
fin

4.4 Resolucin de problemas usando arreglos unidimensionales.

Ejemplo 1) Se desea crear un algoritmo en pseudocdigo que permita ingresar 10 valores enteros
por teclado, y los guarde en un arreglo unidimensional. Luego recorrerlo y mostrar los valores que
ocupan las posiciones pares por pantalla.
Algoritmo Muestra_posi_par
tipo
array [1..10] de entero : dato
var
dato : origen
entero: ndice
inicio
escribir ( ingresar los 10 elementos del arreglo)
desde ndice 1 hasta 10 hacer //se toman los valores del teclado
leer ( origen [ndice])
fin-desde
escribir ( Se muestran los elementos de las posiciones pares del arreglo lineal)
desde ndice 2 hasta 10 inc 2 hacer // se muestran por pantalla los datos del arreglo lineal
escribir (origen [ndice])
fin-desde
fin
Ejemplo 2) Se desea crear un algoritmo en pseudocdigo que permita ingresar 20 valores enteros
por teclado, y los guarde en un arreglo unidimensional. Luego recorrerlo y mostrar los valores
positivos que sean pares por pantalla.
Algoritmo Muestra_positivos_par
tipo
array [1..20] de entero : dato
var
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-8-

dato : vec
entero: ndice
inicio
escribir ( ingresar los 20 elementos del arreglo)
desde ndice 1 hasta 20 hacer //se toman los valores del teclado
leer ( ver [ndice])
fin-desde
escribir ( Se muestran los elementos positivos pares)
desde ndice 1 hasta 20 hacer // se recorre los datos del arreglo lineal
si (vec [ndice] > 0) y (vec [ndice] mod 2 = 0) entonces
mostrar (vec[ndice])
fin-si
fin-desde
fin
Ejemplo 3) Se desea crear un algoritmo en pseudocdigo que permita ingresar 20 valores enteros
por teclado, y los guarde en un arreglo unidimensional. Luego recorrerlo y mostrar los valores
positivos que sean pares por pantalla.
Algoritmo Muestra_positivos_par
tipo
array [1..20] de entero : dato
var
dato : vec
entero: ndice
inicio
escribir ( ingresar los 20 elementos del arreglo)
desde ndice 1 hasta 20 hacer //se toman los valores del teclado
leer ( ver [ndice])
fin-desde
escribir ( Se muestran los elementos positivos pares)
desde ndice 1 hasta 20 hacer // se recorre los datos del arreglo lineal
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

-9-

si (vec [ndice] > 0) y (vec [ndice] mod 2 = 0) entonces


mostrar (vec[ndice])
fin-si
fin-desde
fin
Ejemplo 4) Se desea crear un algoritmo en pseudocdigo que permita ingresar 20 valores enteros
por teclado, y los guarde en un arreglo unidimensional. Luego recorrerlo y guardar los enteros
positivos en otro arreglo del mismo tipo. Mostrar los valores de este segundo arreglo porr pantalla.
Algoritmo Detecta_positivos_arreglo
tipo
array [1..20] de entero : dato
var
dato : origen, destino
entero: ndice, indice2
inicio
escribir ( ingresar los 20 elementos del arreglo)
desde ndice 1 hasta 20 hacer //se toman los valores del teclado
leer ( ver [ndice])
fin-desde
// Se detectan y guardan los enteros positivos en arreglo destino
Indice2 1
desde ndice 1 hasta 20 hacer // se recorre los datos del arreglo origen
si (vec [ndice] > 0) entonces
destino[ndice2] vec [ndice]
indice2 indice2 +1
fin-si
fin-desde
escribir (Se muestran los elementos del arreglo destino)
desde ndice 1 hasta indice2 hacer
mostrar( destino [ndice])
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 10 -

fin-desde
fin
Ejemplo 5) Se desea crear un programa que permita guardar 15 caracteres tomados desde el
teclado, el algoritmo deber contar cuantas letras son maysculas. Mostrar este resultado por
pantalla.
Algoritmo Cuenta_Maysculas
tipo
array [1..15] de caracter : dato
var
dato : ar
entero: ndice, cant_May
inicio
cant_May 0
escribir ( ingresar los 15 caracteres del teclado)
desde ndice 1 hasta 15 hacer //se toman los valores del teclado
leer ( ar [ndice])
fin-desde
// Se detectan y cuentan las letras maysculas
desde ndice 1 hasta 15 hacer
si ((ar [ndice] > A) y ( ar[ndice] < Z0)) entonces
cant_May cant_May +1
fin-si
fin-desde
escribir (La cantidad de letras maysculas del arreglo es:, cant_May)
fin

4.5 Concepto de arreglo bidimensional.


Los vectores hasta aqu analizados, se denominan arreglos lineales o unidimensionales.
Existen situaciones en que la informacin es mejor organizarla en forma de tabla o matriz con dos
subndices, uno para las filas y otro para recorrer las columnas.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 11 -

El arreglo bidimensional se puede considerar como un vector de vectores. Por lo tanto es un


conjunto de elementos, todos del mismo tipo, en el cual el orden de los elementos es significativo
y en el que se necesita especificar dos subndices, para poder identificar cada elemento del
arreglo.
En la figura 4, se representa una tabla de 4 filas por 3 columnas. Cada elemento del arreglo se
referencia con el mismo nombre, pero los valores de los subndices son nicos para cada
elemento de la tabla.

Fila 1
Fila 2

Fila 3
Fila 4

Fila 5

Columna 3
Columna 2
Columna 1

Figura 4

En notacin estndar el primer subndice hace referencia a las filas, y el segundo a los elementos
de las columnas del arreglo. Es decir Tabla [2,3] es el elemento Tabla que ocupa la posicin
segunda fila, tercer columna, como se indica en la figura 5.
El arreglo Tabla se dice que tiene 5 por 3 elementos.
En pseudocdigo los arreglos bidimensionales se declaran de la siguiente forma:
Algoritmo Declaracion_ArregloBidimensional
tipo
array [1..5,1..3] de enteros : T
var
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 12 -

T : Tabla
entero: j,k
inicio
..

Tabla

Fila 1
Fila 2

Tabla[2,3]

Fila 3
Fila 4

Fila 5

Columna 3
Columna 2
Columna 1

Figura 5

4.6 Utilizacin de arreglos bidimensionales en algoritmos.


Los arreglos bidimensionales son muy frecuentes, por ejemplo si se desease almacenar las
calificaciones de los alumnos de un determinado grado, en tres materia: matemtica, lengua e
historia, se debera construir una tabla, las filas seran los nombre de los alumnos y las columnas
seran las notas de los alumnos en las tres materias distintas, por ejemplo en la columna 1, las
notas de matemtica, en la columna 2 las de lengua y en la columna 3 las de historia. El contenido
de cada celda sera un nmero entero, la declaracin de esta tabla para 10 alumnos, se muestra
en la figura 6.
Segn la tabla de la figura 6, las notas de los alumnos de matemtica son: 8, 7, 4, 10, 2, 1, 7, 8,
10, 2.
Las notas de los alumnos en la materia de lengua son: 5, 2, 10, 2, 8, 8, 5, 5, 10, 5 y las notas en la
materia de historia son: 7,10, 5, 4, 1, 3, 7, 4, 3, 10.
Si se hace una lectura horizontal, se puede decir que el alumno de la fila 1, tiene un 8 (ocho) en
matemtica, un 5 (cinco) en lengua y un 7 (siete) en historia.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 13 -

nota-alu
Fila 1
Fila 2

Fila 3
Fila 4

10

10

10

Fila 5

1
3

10

10

10

7
8

Columna 1
matemtica

Columna 3
Columna 2

historia

lengua

Figura 6

Tambin son tiles para representar los elementos de un almacn, por ejemplo. Los saldos en
cuentas bancarias, o en distintos tipos de cuentas bancarias de un mismo cliente, etc.

4.7 Manejo de ndices.


Para recorrer arreglos bidimensionales es necesario tener dos estructuras repetitivas anidadas.
Las estructuras que mejor se adaptan a estos casos son las estructuras desde/fin-desde.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 14 -

En pseudocdigo se expresa de la siguiente manera:


Algoritmo Declaracion_ArregloBidimensional1
tipo
array [1..5,1..3] de enteros : T
var
T : Tabla
Entero: i,j
Inicio
desde i 1 hasta 5 hacer
desde j 1 hasta 3 hacer
// sentencias
fin-desde
fin-desde
fin

Para leer datos desde el teclado, guardarlos en un arreglo bidimensional, y luego recorrerlo para
mostarlo, se realiza lo siguiente:
Algoritmo Declaracion_ArregloBidimensional1
tipo
array [1..5,1..3] de enteros : T
var
T : Tabla
entero: i,j
Inicio
desde i 1 hasta 5 hacer
desde j 1 hasta 3 hacer
leer ( Tabla [i,j]
fin-desde
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 15 -

fin-desde
// se recorre el arreglo para mostrar los elementos almacenados por pantalla
desde i 1 hasta 5 hacer
desde j 1 hasta 3 hacer
escribir ( Tabla [i,j]
fin-desde
fin-desde
fin

Por cada valor que toma la variable i, el bucle interno ocurre completamente, es decir por cada
valor que asume la variable i, j toma los valores de 1 a 3.

4.8 Resolucin de problemas usando arreglos bidimensionales.


Ejemplo 1) Se desea crear un algoritmo en pseudocdigo que permita ingresar las notas de 10
alumnos en las materias de fsica (primera columna) y matemtica (segunda columna)
correspondientes a un curso. Se desea determinar el promedio general del curso y por materia.
Mostrar estos valores por pantalla.
Algoritmo Muestra_promedios
tipo
array [1..10, 1..2] de entero : matriz
var
matriz: mat
entero: i, j, total, total2
inicio
total 0
escribir ( ingresar las notas de los 10 alumnos en las dos materias)
// se carga por fila desde el teclado
desde i 1 hasta 10 hacer
desde j 1 hasta 2 hacer
leer ( mat [i,j)
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 16 -

fin-desde
fin-desde
//se calcula el promedio general
desde i 1 hasta 10 hacer
desde j 1 hasta 2 hacer
total total + mat [i, j]
fin-desde
fin-desde
escribir ( el promedio general es: , total / 20)
total 0
total2 0
escribir ( Se calculan los promedios por materia)
desde i 1 hasta 10 hacer
total total + mat [i,1]
total2 total2 + mat [i, 2]
fin-desde
escribir ( el promedio en fsica es: , total/10, el promedio en matemtica es:, total2/ 10)
fin

Ejemplo 2) Se desea crear un algoritmo en pseudocdigo que permita leer una tabla con
temperaturas. La tabla tiene 5 filas correspondientes a 5 momentos distintos del da, y tiene 3
columnas correspondientes a 3 das distintos. Se desea detectar la temperatura mnima y la
mxima de la tabla completa. Mostrar los valores hallados por pantalla.
Algoritmo Muestra_mn_mx
tipo
array [1..5, 1..3] de real : matriz
var
matriz : mat
entero: i, j
real: mi, ma
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 17 -

inicio
escribir ( ingresar los 15 elementos de la tabla)
desde i 1 hasta 5 hacer //se toman los valores del teclado
desde j 1 hasta 3 hacer
leer ( mat [i, j])
fin-desde
fin-desde
escribir ( Se detecta el mnimo y el mximo)
ma mat [1, 1]
mi mat [1, 1]
desde i 1 hasta 5 hacer
desde j 1 hasta 3 hacer
si mat [i, j] > max entonces
ma mat [i, j]
fin-si
si mat [i, j]< mi entonces
mi mat [i, j]
fin-si
fin-desde
fin-desde
mostrar (la temperatura mnima es: , mi, la temperatura mxima es:, ma)
fin
Ejemplo 3) Se desea crear un algoritmo en pseudocdigo que permita obtener el nmero de
elementos positivos de una tabla de m x n. Mostrar el valor hallado por pantalla.
Algoritmo Muestra_positivos
tipo
array [1..50, 1..50] de entero : matriz
var
matriz : ma
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 18 -

entero: i, j, cont, cat_f, cant_c


inicio
escribir ( ingresar el nmero de filas menor a 50)
leer (cant_f)
escribir ( ingresar el nmero de columnas menor a 50)
leer (cant_c)
escribir (se ingresan los elementos de una tabla de :,cant_f, y de , cant_c,de columnas)
desde i 1 hasta cant_f hacer //se toman los valores del teclado
desde j 1 hasta cant_c hacer
leer ( ma [i, j])
fin-desde
fin-desde
cont 0
escribir ( Se cuentan los positivos)
desde i 1 hasta cant_f hacer // se recorre los datos del arreglo lineal
desde j 1 hasta cant_c hacer
si (ma [i, j] > 0) entonces
cont cont + 1
fin-si
fin-desde
fin-desde
mostrar ( la cantidad de positivos es: , cont)
fin
Ejemplo 4) Se desea crear un algoritmo en pseudocdigo que permita sumar los contenidos de
dos tablas de 5x 5 cada una. El resultado se almacenara en otra tabla de la misma dimensin.
Luego recorrer la tabla suma para mostrar los valores por pantalla.
Algoritmo suma_tablas
tipo
array [1..5, 1..5] de entero : mat
var
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 19 -

mat :ma1, ma2,maSuma


entero: i, j
inicio
escribir ( ingresar los elementos de la primera tabla de 5 x5 por fila)
desde i 1 hasta 5 hacer //se toman los valores del teclado
desde j 1 hasta 5 hacer
leer ( ma1 [i, j])
fin-desde
fin-desde
escribir ( ingresar los elementos de la segunda tabla de 5 x5 por fila)
desde i 1 hasta 5 hacer //se toman los valores del teclado
desde j 1 hasta 5 hacer
leer ( ma2 [i, j])
fin-desde
fin-desde
// se suman elementos homlogos y se guardan en la matriz
desde i 1 hasta 5 hacer //
desde j 1 hata 5 hacer
maSuma [ i, j] ma1 [i, j] + ma2 [i, j]
fin-desde
fin-desde
escribir (Se muestran los elementos de la matriz suma)
desde i 1 hasta 5 hacer
desde j1 hasta 5 hacer
mostrar( maSuma [i, j])
fin-desde
fin-desde
fin

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 20 -

Ejemplo 5) Se desea crear un programa que permita guardar 16 caracteres tomados desde el
teclado, en un arreglo bidimensional de 4 x 4. Se solicitar el ingreso del nmero de fila desde el
teclado, el programa mostrar por pantalla todos los elementos de esa fila.
Algoritmo Muestra_fila
tipo
array [1..4, 1..4] de caracter : dato
var
dato : ar
entero: i, j, fila
inicio
escribir ( ingresar los 16 caracteres del teclado)
desde i 1 hasta 4 hacer //se toman los valores del teclado
desde j 1 hasta 4 hacer
leer ( ar [i, j])
fin-desde
fin-desde
mostrar ( Introducir una fila entre 1 y 4)
repetir
leer ( fila)
hasta-que fila >=1 y fila < =4
escribir (Los elementos de la fila: , fila, son:)
desde i 1 hasta 4 hacer
mostrar ( ar [fila, j])
fin-desde
fin-desde
fin

4.9 Ejercicios de aplicacin.

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 21 -

Ejemplo 1) Leer una tabla de 3 x3. Declarar dos arreglos unidimensionales uno llamado fila y otro
columna, en estos arreglos se guardarn los totales de las filas y los totales de las columnas de la
tabla de 3 x 3. Luego mostrar por pantalla los arreglos lineales.
Algoritmo Suma_fila_columna
tipo
array [1..3, 1..3] de entero : Mat
array [1..3] de entero :vector
var
Mat : ma
vector: vec1, vec2
entero: i, j, suma
inicio
escribir ( ingresar los 9 elementos del teclado)
desde i 1 hasta 3 hacer //se toman los valores del teclado
desde j 1 hasta 3 hacer
leer ( ma [i, j])
fin-desde
fin-desde
// se completa el arreglo fila
Suma 0
desde i 1 hasta 3 hacer
desde j 1 hasta 3 hacer
suma suma + ma [i, j])
fin-desde
vect1[i] suma
suma 0
fin-desde
// se completa el arreglo columna
Suma 0
desde j 1 hasta 3 hacer
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 22 -

desde i 1 hasta 3 hacer


suma suma + ma [i, j])
fin-desde
vect1[j] suma
suma 0
fin-desde
//se muestran por pantalla los elementos del vector de filas
desde i 1 hasta 3 hacer
mostrar ( vect1 [ i ])
fin-desde
//se muestran por pantalla el vector de columnas
desde i 1 hasta 3 hacer
mostrar ( vect2 [ i ])
fin-desde
fin
Ejemplo 2) Crear una tabla de 4 x4. Declarar un arreglo unidimensional, en el se guardarn los
elementos de la diagonal principal. Luego mostrar por pantalla los elementos del arreglo lineal.
Algoritmo vector-diagonal
tipo
array [1..4, 1..4] de real : Mat
array [1..4] de real :vector
var
Mat : ma
vector: vec1
entero: i, j
inicio
escribir ( ingresar los 16 elementos del teclado)
desde i 1 hasta 4 hacer //se toman los valores del teclado
desde j 1 hasta 4 hacer
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 23 -

leer ( ma [i, j])


fin-desde
fin-desde
// se completa el arreglo lineal
desde i 1 hasta 4 hacer
vec [ i ] ma [i, i])
fin-desde
//se muestran por pantalla los elementos del vector diagonal principal
desde i 1 hasta 4 hacer
mostrar ( vec [ i ])
fin-desde
fin

Ejemplo 3) Crear una lista con N temperaturas almacenadas. Se desea calcular la media y crear
otro arreglo con los valores mayores a la media. Luego mostrar por pantalla los elementos de los
arreglos lineales.
Algoritmo vector-media
tipo
array [1..50] de real : vector
var
vector: origen, destino
entero: i, N
real: suma, media
inicio
escribir ( ingresar el nmero de elementos que tendr el arreglo)
leer (N )
escribir (Ingresar los elementos del arreglo lineal)
desde i 1 hasta N hacer //se toman los valores del teclado
leer ( origen [i ])
fin-desde
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 24 -

// se calcula la media
Suma 0
desde i 1 hasta N hacer
suma suma + origen [ i ]
fin-desde
media suma / N
j0
//se comparan los elementos del arreglo origen con la madia
desde i 1 hasta N hacer
si origen [ i ] > media entonces
j j+1
destino [j ] origen [ i]
fin-si
fin-desde
mostrar ( se muestra el arreglo origen )
desde i 1 hasta N hacer //se toman los valores del teclado
escribir ( origen [i ])
fin-desde
mostrar ( se muestra el arreglo destino )
desde i 1 hasta j hacer //se toman los valores del teclado
mostrar ( destino [i ])
fin-desde
fin
Ejemplo 4) Crear una lista con N nombres de alumnos. Se desea introducir un nombre de alumno
por teclado 10 veces, y mostrar un mensaje adecuado si el nombre est en la lista.
Algoritmo Lista-nombre
tipo
array [1..50] de cadena : vector
var
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 25 -

vector: vec
entero: i, cant
cadena: nom
inicio
repetir
escribir ( ingresar el nmero de elementos que tendr el arreglo)
leer (N )
hasta-que N>=1 y N <= 50
escribir (Ingresar los elementos del arreglo lineal)
desde i 1 hasta N hacer //se toman los valores del teclado
leer ( vec [i ])
fin-desde
cant 0
mientras cant < 10 hacer
escribir (Ingresar un nombre de alumno a buscar en la lista
leer ( nom)
desde i 1 hasta N hacer
si vec [ i ] = nom entonces
mostrar ( el nombre:, nom, est en la lista)
si-no
mostrar (el nombre:, nom, no est en la lista)
fin-si
fin-desde
cant cant + 1
fin-miesntras
fin

Bibliografa Obligatoria:

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 26 -

Fundamentos de programacin. Algoritmos, Estructuras de datos y Objetos, Luis Joyanes


Aguilar. Mc Graw Hill. Tercera edicin. Captulo 7 (pginas 247 a 284)

Unidad 5: Ordenacin y bsqueda


5.1 Ordenacin. Mtodos

El ordenamiento es una labor comn que realizamos continuamente. Pero, qu es ordenar? El


ordenamiento es algo tan corriente en nuestras vidas que no nos detenemos a pensar en ello.
Ordenar es simplemente colocar informacin de una manera especial basndonos en un criterio
de ordenamiento. La finalidad de un ordenamiento, es el de facilitar el acceso a la informacin.
En la computacin el ordenamiento de datos tambin cumple un rol muy importante, ya sea como
un fin en s o como parte de otros procedimientos ms complejos. Se han desarrollado muchas
tcnicas en este mbito, cada una con caractersticas especficas, y con ventajas y desventajas
sobre las dems. En esta unidad vamos a mostrar algunas de las ms comunes, tratando de
hacerlo de una manera sencilla y comprensible.

CONCEPTOS PRELIMINARES
Antes de comenzar a ver cada algoritmo vamos a ponernos de acuerdo en algunos conceptos,
para que no haya confusiones:
Clave: La parte de un conjunto de datos (registro), por la cual se ordena la lista. Por ejemplo, una
lista de registros, en la que cada registro de esa lista tiene tres campos diferentes: nombre,
direccin y telfono se puede ordenar alfabticamente de acuerdo a la clave nombre. En este
caso los campos direccin y telfono no se toman en cuenta en el ordenamiento.
Criterio de ordenamiento (o de comparacin): EL criterio que utilizamos para asignar valores a
los registros con base en una o ms claves. De esta manera decidimos si un registro es mayor o
menor que otro.
Registro: Un grupo de datos que forman la lista. Pueden ser datos atmicos (enteros, caracteres,
reales, etc.) o grupos de ellos.
Cuando se estudian algoritmos de todo tipo, no slo de ordenamiento, es bueno tener una forma
de evaluarlos antes de pasarlos a cdigo, que se base en aspectos independientes de la
plataforma o el lenguaje. De esta manera podremos decidir cul se adapta mejor a los
requerimientos de nuestro programa. Algunos de estos aspectos son:

Estabilidad: Este parmetro establece o mide cmo se comporta, el algoritmo con


registros que tienen claves iguales. Algunos algoritmos mantienen el orden relativo entre
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 27 -

stos y otros no. Veamos un ejemplo. Si tenemos la siguiente lista de datos (nombre,
edad): "Pedro 19, Juan 23, Felipe 15, Marcela 20, Juan 18, Marcela 17", y la ordenamos
alfabticamente por el nombre con un algoritmo estable quedara as: "Felipe 15, Marcela
20, Marcela 17, Juan 23, Juan 18, Pedro 19". Un algoritmo no estable podra dejar a
Juan 18 antes de Juan 23, o a Marcela 20 despus de Marcela 17.

Tiempo de ejecucin: Este parmetro mide la complejidad del algoritmo, que no tiene que
ver con dificultad, sino con rendimiento. Es una funcin independiente de la
implementacin.
Una medida de eficiencia es:
Contar el nmero de comparaciones
Contar el nmero de movimientos de tems
Estos estn en funcin del nmero de elementos a ser ordenados.
En el ordenamiento una operacin fundamental es la de comparar. Ahora contamos
cuntas veces el algoritmo necesita comparar. Si en una lista de n trminos realiza n
comparaciones la complejidad es O(n). (En realidad es un poco ms complicado que eso).
Algunos ejemplos de complejidades comunes son:
O(1): Complejidad constante.
O(n2): Complejidad cuadrtica.
O(n log(n)): Complejidad logartmica.
Ahora podemos decir que un algoritmo de complejidad O(n) es ms rpido que uno de
complejidad O(n2). Otro aspecto a considerar es la diferencia entre el peor y el mejor caso.
Cada algoritmo se comporta de modo diferente de acuerdo a cmo se le entregue la
informacin; por eso es conveniente estudiar su comportamiento en casos extremos, como
cuando los datos estn prcticamente ordenados o muy desordenados.

Requerimientos de memoria: El algoritmo puede necesitar memoria adicional para


realizar su labor. En general es preferible que no sea as, pero es comn en la
programacin tener que sacrificar memoria por rendimiento.

Hay ms aspectos que se pueden tener en cuenta para realizar un anlisis de calidad sobre un
algoritmo de ordenamiento en particular, pero slo vamos a mencionar en esta materia los hasta
aqu descriptos.
Por ltimo estableceremos algunas convenciones sobre el pseudocdigo:
Vamos a ordenar la lista en forma ascendiente, es decir, de menor a mayor. Obviamente es
esencialmente lo mismo que hacerlo en forma inversa.
La forma de intercambiar los elementos depende de la estructura de datos: si es un arreglo
(dinmico o esttico) es necesario guardar una copia del primer elemento, asignarle el segundo al
primero y el temporal al segundo. La variable temporal es necesaria, porque de lo contrario se
perdera uno de los elementos. Si la estructura es una lista dinmica el procedimiento es parecido,
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 28 -

pero se utilizan las direcciones de los elementos. En el pseudocdigo se utilizar el primer


mtodo.
La siguiente es una tabla comparativa de algunos algoritmos de ordenamiento, segn los
parmetros ya vistos.

Tabla comparativa de algoritmos


Nombre

Complejidad Estabilidad Memoria adicional

Ordenamiento Burbuja

O(n2)

Estable

Ordenamiento por Seleccin

O(n2)

No Estable No

Ordenamiento por insercin

O(n2)

Estable

No

No

Ordenamiento Rpido (Quicksort) O(n * log2(n)) No Estable No

Cada algoritmo se comporta de modo diferente de acuerdo a la cantidad y la forma en que se le


presenten los datos, entre otras cosas. No existe EL algoritmo de ordenamiento. Slo existe el
mejor para cada caso particular. Se debe conocer el problema que se desea resolver, y aplicar el
algoritmo ms adecuado. Hay algunos interrogantes que pueden ayudar a escoger un algoritmo
en especial:
Qu grado de orden tendr la informacin que vas a manejar? Si la informacin va a estar
casi ordenada y no quieres complicarte, un algoritmo sencillo como el ordenamiento burbuja ser
suficiente. Si por el contrario los datos van a estar muy desordenados, un algoritmo poderoso
como Quicksort puede ser el ms indicado. Si por forma en que se presenta la informacin no es
posible hacer una presuncin sobre el grado de orden de la informacin, lo mejor ser elegir un
algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos.
Qu cantidad de datos vas a manipular? Si la cantidad es pequea, no es necesario utilizar un
algoritmo complejo, y es preferible uno de fcil implementacin. Una cantidad muy grande puede
hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria adicional.
Qu tipo de datos quieres ordenar? Algunos algoritmos slo funcionan con un tipo especfico
de datos (enteros, enteros positivos, etc.) y otros son generales, es decir, aplicables a cualquier
tipo de dato.
Qu tamao tienen los registros de tu lista? Algunos algoritmos realizan mltiples
intercambios (burbuja, insercin). Si los registros son de gran tamao estos intercambios son ms
lentos.

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 29 -

El ordenamiento es una labor comn que realizamos cotidianamente, es un proceso tan comn en
nuestras vidas que no nos detenemos a meditar mucho en ello. Ordenar es meramente colocar
informacin de una manera especial basndonos en un criterio de ordenamiento.
El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una
secuencia tal que represente un orden, el cual puede ser numrico, alfabtico o incluso
alfanumrico, ascendente o descendente.

Tipos de ordenamientos
a- internos
Los datos a ordenar estn en memoria la principal Ram, por lo que se asume que el tiempo que se
requiere para acceder cualquier elemento sea el mismo. En el siguiente cuadro aparecen mtodos
que explcitamente pide desarrollar el programa y otros que no se trabajan en la materia, como
para presentar un panorama amplio del ordenamiento

Insercin Directa
Insercin Directa
Insercin Binaria
Seleccin Directa

Seleccin Directa
Burbuja

Intercambio Directo
Shake
Insercin Disminucin Incremental Shell
Heap
Ordenamiento De rbol
Tournament
Sort Particionado

Quick Sort

Merge Sort
Radix Sort
Clculo De Direccin

b- externos
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 30 -

Los datos a ordenar estn en la memoria secundaria, es decir, por ejemplo disco duro, disco
extrable, por lo que se asume que el tiempo que se requiere para acceder a cualquier elemento
depende de la ltima posicin consultada.
Straight Merging
Natural Merging
Balanced Multiway Merging
Polyphase Sort
Distribution Of Initial Runs

Clasificacin de los algoritmos de ordenamiento:


Insercin Directa
Algoritmos de insercin:

Shell
Insercin Binaria
Hashing
Burbuja

Algoritmos de intercambio:

Shake
QuickSort

Algoritmos de seleccin:

Seleccin Directa
Merge

Algoritmos de enumeracin: Radix


Heap
Los mtodos simples son: Insercin Directa, Seleccin, Burbuja y Shell, en dnde el ltimo es una
extensin al mtodo de Insercin, siendo ms rpido. Los mtodos ms complejos son Quick Sort
y Heap.
La ordenacin (clasificacin) es la operacin de organizar un conjunto de datos en algn orden
dado, tal como creciente o decreciente para los datos numricos, o en orden alfabtico para
caracteres o cadenas (directo o inverso).
Los mtodos de ordenamiento directos, son aquellos que para realizar el ordenamiento utilizan el
espacio del arreglo.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 31 -

La ordenacin de informacin es una de las aplicaciones ms importantes de la computacin. Por


ejemplo un banco ordena los cheques por nmero de cuenta para poder preparar los estados de
cuenta al cierre del mes. Otro caso lo constituyen las compaas de telfonos, estos ordenan sus
listas de cuenta por apellido y nombre para hacer ms fcil la localizacin de nmeros telefnicos.
Prcticamente todas las organizaciones tienen informacin a ordenar y en muchos casos son
grandes volmenes de datos. El ordenamiento de datos es un problema interesante que ha
provocado reas de investigaciones en la ciencia de la computacin.
Los mtodos de ordenamiento ms populares son:

Intercambio

Seleccin

Insercin

En algunas circunstancias es clara la ventaja de usar un mtodo en lugar de otros.

5.2 Ordenacin por seleccin.


Este mtodo se basa en buscar el elemento menor del vector y colocarlo en primera posicin.
Luego se busca el segundo elemento ms pequeo y se coloca en la segunda posicin, y as
sucesivamente.
Los pasos sucesivos son:
1. Seleccionar el elemento menor del vector de n elementos
2. Intercambiar dicho elemento con el primero
3. Repetir estas operaciones con los n-2 elementos restantes hasta que slo quede el mayor
Un ejemplo aclarar el mtodo:
120 45 2 36 89

90

23

El mtodo busca el ms pequeo, y lo intercambia con el elemento que ocupa la primera posicin
2 45

120

36

89

90

23

Luego busca el nmero ms pequeo entre los que quedan menos el primer elemento que ya est
ubicado.
2

23

120 36

89 90

45

Ahora busca el elemento que ocupa la tercera posicin en el ordenamiento:


2

23

36

120

89

90

45

Busca el elemento que ocupa la 4 posicin en el vector ordenado:


2

23

36

45

89

90

120
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 32 -

Busca el elemento que ocupa la 5 posicin:


2

23

36

45

89

90

120

La posicin 6 y 7 ya estn ordenadas, pero el mtodo seguir iterando y confirmar sus


posiciones en el ordenamiento.
2

23

36

45

89

90

120

La ltima pasada ratificar el ltimo valor


2

23

36

45

89

90

120

Un algoritmo para este mtodo de ordenacin es:


Algoritmo ordenacin_seleccin
tipo
array [1..7] de entero : vector
var
vector: vec
entero: i, j, aux
inicio
escribir ( ingresar los valores 2, 23, 36, 45, 89, 90, 120)
desde i 1 hasta 7 hacer
leer (vec [i ] )
fin-desde
escribir (Comienza el ordenamiento)
desde i 1 hasta 6 hacer
desde j i+1 hasta 7 hacer
si vec [i ] > vec [ j ] entonces
aux vec [ i ]
vec [i ] vec [ j ]
vec [j ] aux
fin-si
fin-desde

fin-desde
escribir (el vector ordenado es: )
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 33 -

desde i 1 hasta 7 hacer


mostrar ( vec [ i ])
fin-desde
fin

Si se quisiese ordenar en forma decreciente los elementos, slo habra que dar vuelta el signo de
la desigualdad:
si vec [i ] < vec [ j ] entonces
La parte del intercambio corresponde al siguiente trozo de cdigo:
aux vec [ i ]
vec [i ] vec [ j ]
vec [j ] aux

cmo puede verse se requiere una variable auxiliar para el intercambio.

5.3 Ordenacin por insercin.


Este mtodo consiste en insertar un elemento en una parte ya ordenada del vector y comenzar de
nuevo con los elementos restantes. Este tambin es un algoritmo lento, pero puede ser de utilidad
para listas que estn a medio ordenar, pues en ese caso realiza pocos desplazamientos.
Tambin se lo conoce como el mtodo de la baraja.
Tiempo de Ejecucin: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces.
Complejidad O(n2).
Estabilidad: No intercambia registros con claves iguales. Por lo tanto es estable.
Ventajas:
Fcil implementacin.
Requerimientos mnimos de memoria.
Desventajas:
Lento.
Numerosas comparaciones.

EJEMPLO PRACTICO
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 34 -

Explicaremos el mtodo sobre una lista de nmeros enteros desordenados, por ejemplo:
67 90

30

21

51

Paso1: toma las dos primeras posiciones y las ordena


67 90

30

21

51

Paso 2: toma el 3 elemento y lo inserta ordenado en la parte que ya est ordenada, previo
desplazar los elementos ordenados en forma lineal, para lo cual el elemento a insertar se guarda
en una variable auxiliar, lo cual permite hacer el desplazamiento de los elementos ordenados de la
lista:
67

90

30

21

51

67

90

90

21

51

67

67

90

21

51

aux= 30

Paso 3: toma el 4 elemento y busca insertarlo en la parte ordenada del vector. Para ello guarda el
valor a insertar en una variable auxiliar, y luego entra a desplazar los elementos ordenados
buscando el lugar adecuado para la insercin.
30

67

90

21

51

Aux = 21
30

67

90

90

51

21

67

67

90

51

30

30

67

90

51

21

30

67

90

51

(notar que el 4 y el 51 de la lista ocupan el mismo lugar)

Paso 4: toma el 5 elemento y busca insertarlo en la parte ordenada del vector. Para ello guarda el
valor a insertar en una variable auxiliar, y luego entra a desplazar los elementos ordenados
buscando el lugar adecuado para la insercin.
21

30

67

90

51

Aux = 4
21

30

67

90

90

51

21

30

67

67

90

51

21

30

30

67

90

51

21

21

30

67

90

51

21

30

67

90

(notar que el 51 de la lista ocupa el mismo lugar)

51

Paso 5: toma el 5 elemento y busca insertarlo en la parte ordenada del vector. Para ello guarda el
valor a insertar en una variable auxiliar, y luego entra a desplazar los elementos ordenados
buscando el lugar adecuado para la insercin.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 35 -

21

30

67

90

51

Aux = 51
4

21

30

67

90

90

21

30

67

67

90

21

30

51

67

90

El arreglo lineal queda ordenado.


Por lo tanto el mtodo se basa en comparaciones y desplazamientos sucesivos. El algoritmo de
clasificacin de un vector X para N elementos se realiza con un recorrido de todo el vector y la
insercin del elemento correspondiente en el lugar adecuado. El recorrido se puede realizar desde
el segundo al n-simo.
desde i 2 hasta N hacer
// insertar X [i ] en el lugar adecuado entre X[1 ].. X [i-1 ]
fin-desde
En el siguiente cdigo se utiliza un centinela o bandera (sw)

algoritmo orden_insercin-directa
//declaraciones
inicio

desde i 2 hasta N hacer


aux X [ i]
k i-1
sw falso
mientras no (sw) y ( k > = 1) hacer
si aux < X [k ] entonces
X [k +1] X [k ]
K k-1
si-no
sw verdadero
fin-si
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 36 -

fin-mientras
X [k +1] aux
fin-desde
fin
Existe una forma de mejorar el algoritmo de insercin lineal o directa. Para ello se utiliza el mtodo
de buscada binaria para ubicar la posicin correcta y no realizar un desplazamiento lineal.
En pseudocdigo el algoritmo de insercin mejorada es:
algoritmo orden_insercin_binaria
//declaraciones
inicio

desde i 2 hasta N hacer


aux X [ i]
P 1 //primero
U i -1 // ultimo
mientras P < = U hacer
C ( P+ U) div 2
si aux < X [C ] entonces
UC-1
si-no
P C +1
fin-si
fin-mientras
desde K i -1 hasta P decrementar 1 hacer
X [k +1] X [ K ]
fin-desde
X [ P ] aux
fin-desde
fin
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 37 -

5.4 Ordenacin por burbuja.


Algoritmo Burbuja
BubbleSort recorre el arreglo intercambiando los elementos adyacentes que estn desordenados.
Recorre el arreglo tantas veces hasta que ya no haya cambios. Prcticamente lo que hace es
tomar el elemento mayor y lo coloca en las ltimas posiciones o tomar el menor y colocarlo en las
primeras posiciones.
Tiempo de ejecucin: El ciclo interno se ejecuta n veces. El ciclo externo tambin se ejecuta n
veces, la complejidad es n * n = O(n2). El comportamiento del caso promedio depende del orden
de entrada de los datos, pero es slo un poco mejor que el del peor caso, y sigue siendo O(n2).
Estabilidad: No intercambia registros con claves iguales.
Ventajas:
Fcil implementacin.
No requiere memoria adicional.
Desventajas:
Muy lento.
Muchas comparaciones.
Muchos intercambios.

En pseudocdigo el algoritmo es:

algoritmo Mtodo_Burbuja
//declaraciones
inicio
// lectura del vector
desde i 1 hasta N hacer
leer ( vec[ i ] )
fin-desde
//ordenamiento del vector
desde i 1 hasta n-1 hacer
desde j 1 hasta n-1 hacer
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 38 -

si vec [ j ] > vec [ j +1 ] entonces


//intercambiar
aux vec [ j ]
vec [ j ] vec [ j +1 ]
vec [ j+1 ] aux
fin-si
fin-desde
fin-desde
// mostrar por pantalla el arreglo ordenado
desde i 1 hasta N hacer
mostrar ( vec[ i ] )
fin-desde
fin

5.5 Ordenacin por burbuja mejorada.


Despus de cada pasada (el bucle desde ms externo), el elemento de ms valor se ubica en el
extremo del arreglo. Lo que significa que toma su posicin correcta, por este motivo sera
conveniente que en vez de realizar todas las comparaciones en la segunda pasada, se haga una
comparacin menos.
algoritmo Mtodo_Burbuja_mejorada
//declaraciones
inicio
// lectura del vector
desde i 1 hasta N hacer
leer ( vec[ i ] )
fin-desde
//ordenamiento del vector
desde i 1 hasta n-1 hacer
desde j 1 hasta n- i hacer
si vec [ j ] > vec [ j +1 ] entonces
//intercambiar
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 39 -

aux vec [ j ]
vec [ j] vec [ j +1 ]
vec [ i+1 ] aux
fin-si
fin-desde
fin-desde
// mostrar por pantalla el arreglo ordenado
desde i 1 hasta N hacer
mostrar ( vec[ i ] )
fin-desde
fin

5.6 Ejercicios de aplicacin.


Ejemplo 1) Generar un arreglo de 10 elementos enteros ordenados de menor mayor.
Algoritmo ordenacin_seleccin
tipo
array [1..10] de entero : vector
var
vector: vec
entero: i, j, aux
inicio
escribir ( ingresar los valores)
desde i 1 hasta 10 hacer
leer (vec [i ] )
fin-desde
escribir (Comienza el ordenamiento)
desde i 1 hasta 9 hacer
desde j i+1 hasta 10 hacer
si vec [i ] > vec [ j ] entonces
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 40 -

aux vec [ i ]
vec [i ] vec [ j ]
vec [j ] aux
fin-si
fin-desde

fin-desde
escribir (el vector ordenado es: )
desde i 1 hasta 10 hacer
mostrar ( vec [ i ])
fin-desde
fin

Ejemplo 2) Generar un arreglo de 10 elementos enteros ordenados de mayor a menor.


Algoritmo ordenacin_seleccin
tipo
array [1..10] de entero : vector
var
vector: vec
entero: i, j, aux
inicio
escribir ( ingresar los valores )
desde i 1 hasta 10 hacer
leer (vec [i ] )
fin-desde
escribir (Comienza el ordenamiento)
desde i 1 hasta 9 hacer
desde j i+1 hasta 10 hacer
si vec [i ] < vec [ j ] entonces
aux vec [ i ]
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 41 -

vec [i ] vec [ j ]
vec [j ] aux
fin-si
fin-desde

fin-desde
escribir (el vector ordenado es: )
desde i 1 hasta 10 hacer
mostrar ( vec [ i ])
fin-desde
fin

5.7 Bsqueda. Mtodos.


Un algoritmo de bsqueda es aquel que est diseado para localizar un elemento concreto
dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de un
elemento determinado en un conjunto finito de elementos, es decir, si el elemento en cuestin
pertenece o no a dicho conjunto, adems de su localizacin dentro de ste.

5.8 Bsqueda secuencial.


Se utiliza cuando el contenido del vector no se encuentra o no puede ser ordenado. Consiste en
buscar el elemento comparndolo secuencialmente (de ah su nombre) con cada elemento del
arreglo hasta que ste se encuentre, o hasta que se llegue al final del arreglo. La existencia se
puede asegurar desde el momento que el elemento es localizado, pero no podemos asegurar la
no existencia hasta no haber analizado todos los elementos del arreglo. A continuacin se
muestra el pseudocdigo del algoritmo:

algoritmo Mtodo_Busqueda_secuencial
//declaraciones
inicio
// lectura del vector
desde i 1 hasta N hacer
leer ( vec[ i ] )
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 42 -

fin-desde
//se toma la clave de bsqueda
leer ( clave)
//bsqueda
ban falso
desde i 1 hasta n hacer
si vec [i ] = clave entonces
ban verdadero
fin-si
fin-desde
si ban = verdadero entonces
mostrar ( la clave de bsqueda est en el arreglo )
si-no
mostrar ( la clave de bsqueda NO est en el arreglo )
fin-si
fin

5.9 Bsqueda binaria.


Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento est
ordenado, o puede estarlo, este algoritmo reduce el tiempo de bsqueda considerablemente, ya
que disminuye exponencialmente con el nmero de iteraciones.
Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del
arreglo (normalmente el elemento central), si el valor de ste es mayor que el del elemento
buscado se repite el procedimiento en la parte del arreglo que va desde el inicio de ste hasta el
elemento tomado, en caso contrario se toma la parte del arreglo que va desde el elemento tomado
hasta el final. De esta manera obtenemos intervalos cada vez ms pequeos, hasta que se
obtenga un intervalo indivisible, con el elemento buscado como elemento central. Si el elemento
no se encuentra dentro de este ltimo entonces se deduce que el elemento buscado no se
encuentra en el arreglo.
La bsqueda binaria utiliza un mtodo de divide y vencers para localizar el elemento deseado.
A continuacin se presenta el pseudocdigo del algoritmo, tomando como elemento inicial el
elemento central del arreglo.
Materia: Programacin Lgica
Profesor: Ing. Silvia Carrera

- 43 -

Algoritmo bsqueda_binaria
// declaraciones
inicio
// llenar el arreglo x con N valores
// ordenar el arreglo
leer ( K) // clave de bsqueda
// se inicializan las variables para la bsqueda
bajo 1
alto N // N es el nmero de elementos del arreglo
central ent ( ( bajo + alto ) / 2)
mientras ( bajo < = alto ) y ( x [ central ] <> K) hacer
si K < x [ central] entonces
alto central -1
si-no
bajo central + 1
fin-si
central ent (( bajo +alto ) / 2)
fin-mientras
si K = x [central] entonces
escribir ( valor encontrado)
si-no
escribir ( valor no encontrar)
fin-si
fin

Bibliografa Obligatoria:

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 44 -

Fundamentos de programacin. Algoritmos, Estructuras de datos y Objetos, Luis Joyanes


Aguilar. Mc Graw Hill. Tercera edicin. Captulo 10 (pginas 360 a 412)

Materia: Programacin Lgica


Profesor: Ing. Silvia Carrera

- 45 -