Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lectura 3 PDF
Lectura 3 PDF
Una estructura de datos es una colección de datos organizados de una cierta manera, y que se
caracterizan por las operaciones que se definen sobre ellas.
Las estructuras estáticas, la memoria se gestiona en tiempo de compilación, mientras que para las
estructuras dinámicas la memoria se gestiona en tiempo de ejecución. La forma de generar los
almacenamientos implican ventajas y desventajas, ambos tipos de estructuras existen en los
lenguajes reales, el uso más conveniente de una forma u otra dependerá de los requerimientos
del problema a resolver.
Dentro de las estructuras estáticas, se encuentran los arreglos (cualquiera sea el número de
dimensiones que tenga) y los registros (estas son colecciones de elementos que pueden ser de
distinto tipo, los cuales se verán más adelante).
Dentro de las estructuras dinámicas 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) más otro tipo de información que ayuda a formar la
estructura de datos de una forma particular.
Los arreglos pueden ser unidimensionales también 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 posición que ocupa dentro del vector. Dichas posiciones son
llamadas índice y siempre son correlativos.
Los vectores se pueden representar gráficamente como muestra la figura1, es decir como un
rectángulo 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: Programación Lógica
Figura 1
El número 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 numéricos y no numéricos, por ejemplo se puede
pensar en un arreglo de carácter. La figura 2, muestra un arreglo de tipo carácter de 5 elementos,
llamado Info.
Figura 2
Otro ejemplo de un arreglo unidimensional no numérico, 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
posición de memoria. Por ejemplo:
Dato [4] 3
Almacena el valor entero o real 3 en el vector Dato en la posición número 4 (dato debe ser de tipo
entero o real).
La instrucción:
Alumno
Luis
Jose
Sonia
Pedro
Celeste
Tomás
Sonia
Pedro
Figura 3
Algoritmo declaración_arreglo
tipo
var
dato : info
entero: índice
inicio
………..
Se debe nota que en este trozo de código se agrega una sección llamada tipo, en esta parte se
declaran los arreglos y otros tipos de datos definidos por el usuario como se verá más adelante.
Se usa la palabra reservada array, seguido entre corchetes el rango como un intervalo cerrado
Materia: Programación Lógica
Si se desea guardar el valor entero 5, en la segunda posición del vector, la instrucción es:
info [2] 5
Algoritmo declaración_arreglo2
tipo
var
entero: índice
inicio
………..
En este trozo de código, 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, lógico 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, según las necesidades que
surjan de los requerimientos del problema a resolver, en el siguiente código se declaran tres
arreglos distintos.
Algoritmo declaración_arreglo3
tipo
var
dato : origen
vector1: vec1
entero: índice
inicio
………..
Los arreglos se utilizan cuando es necesario almacenar varios valores. También se podrían
guardar valores en un conjunto de variables simples, pero esto es más engorroso, y más complejo
de manejar. En lugar de tener 10 variables de tipo real para guardar las alturas de personas, es
más sencillo crear un arreglo de 10 elementos de tipo real, ya que toda la información la manejo
con el mismo nombre de variable; y los elementos se diferencian entre sí según el valor que
asuma un subíndice asociado al vector.
En la práctica 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, deberíamos tener 5000 variables simple,
cada una de ellas contendría un entero que represente este dato (inasistencias). Si por ejemplo se
quisiese ordenar los alumnos por número creciente de inasistencias, para por ejemplo otorgarles
un premio, sería imperioso tener todos los datos activos en memoria, y necesitaría otra variable
para indicar el orden de los datos (5000 variables enteras más). Mientras que con un arreglo
unidimensional de 5000 elementos de tipo entero sería suficiente para contener los datos y una
variable más de tipo entero para indicar el orden dentro del arreglo (subíndice). Ordenado los
datos de menor a mayor, en la primer posición del arreglo (índice = 1) tendría la menor
inasistencia y en la última posición tendría el número más grande correspondiente al mayor
número de falta (índice = 5000).
Como queda explicado con esta breve reflexión, es necesario que los lenguajes de programación
brinden soporte para mantener juntos (referenciados mediante un mismo identificador)
colecciones de de datos del mismo tipo.
x[1], x[2],…,x[n]
El límite inferior no tiene que empezar en 1, puede ser cualquier valor para el subíndice, aunque
es más fácil si el subíndice también sirve para indicar posición, como en el ejemplo anterior. Un
subíndice igual a 1, también indica posición 1, y así.
En este caso el rango del arreglo P es 6, y la posición 1 le corresponde el subíndice -10 y así
sucesivamente.
Asignación
Lectura/escritura
Recorrido
Ordenación búsqueda
ASIGNACION
La asignación de valores a un elemento del arreglo lineal se realiza con la siguiente instrucción:
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/fin-
desde; ya que esta estructura tienen asociada a ella necesariamente una variable que permite
contar las iteraciones, esa variable es la que nos sirve de subíndice.
Algoritmo almacena-valores_arreglo
tipo
var
dato : origen
entero: índice
inicio
fin-desde
………..
Mostrar ( a[2])
Esta instrucción muestra por pantalla el contenido de la posición 2 (si el límite 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 código:
Algoritmo declaración_arreglo4
tipo
var
dato : origen
entero: índice
inicio
desde índice 1 hasta 10 hacer //se toman los valores del teclado
fin-desde
desde índice 1 hasta 10 hacer // se muestran por pantalla los datos del arreglo lineal
fin
Ejemplo 1) Se desea crear un algoritmo en pseudocódigo 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
var
dato : origen
entero: índice
inicio
desde índice 1 hasta 10 hacer //se toman los valores del teclado
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
fin-desde
fin
Ejemplo 2) Se desea crear un algoritmo en pseudocódigo 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
var
entero: índice
inicio
desde índice 1 hasta 20 hacer //se toman los valores del teclado
fin-desde
desde índice 1 hasta 20 hacer // se recorre los datos del arreglo lineal
mostrar (vec[índice])
fin-si
fin-desde
fin
Ejemplo 3) Se desea crear un algoritmo en pseudocódigo 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
var
dato : vec
entero: índice
inicio
desde índice 1 hasta 20 hacer //se toman los valores del teclado
fin-desde
desde índice 1 hasta 20 hacer // se recorre los datos del arreglo lineal
Materia: Programación Lógica
mostrar (vec[índice])
fin-si
fin-desde
fin
Ejemplo 4) Se desea crear un algoritmo en pseudocódigo 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
var
inicio
desde índice 1 hasta 20 hacer //se toman los valores del teclado
fin-desde
Indice2 1
desde índice 1 hasta 20 hacer // se recorre los datos del arreglo origen
indice2 indice2 +1
fin-si
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 mayúsculas. Mostrar este resultado por
pantalla.
Algoritmo Cuenta_Mayúsculas
tipo
var
dato : ar
inicio
cant_May 0
desde índice 1 hasta 15 hacer //se toman los valores del teclado
leer ( ar [índice])
fin-desde
cant_May cant_May +1
fin-si
fin-desde
fin
Existen situaciones en que la información es mejor organizarla en forma de tabla o matriz con dos
subíndices, uno para las filas y otro para recorrer las columnas.
Materia: Programación Lógica
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 subíndices 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 notación estándar el primer subíndice 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 posición
segunda fila, tercer columna, como se indica en la figura 5.
Algoritmo Declaracion_ArregloBidimensional
tipo
var
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
Según la tabla de la figura 6, las notas de los alumnos de matemática 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
matemática, un 5 (cinco) en lengua y un 7 (siete) en historia.
Materia: Programación Lógica
8 5 7
Fila 1
Fila 2 7 2 10
4 10 5
Fila 3
Fila 4 10 2 4
Fila 5
2 8 1
1 8 3
7 5 7
8 5 4
10 10 3
2 5 10
Columna 1 Columna 3
matemática historia
Columna 2
lengua
Figura 6
También son útiles para representar los elementos de un almacén, por ejemplo. Los saldos en
cuentas bancarias, o en distintos tipos de cuentas bancarias de un mismo cliente, etc.
Algoritmo Declaracion_ArregloBidimensional1
tipo
var
T : Tabla
Entero: i,j
Inicio
// 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
var
T : Tabla
entero: i,j
Inicio
fin-desde
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.
Algoritmo Muestra_promedios
tipo
var
matriz: mat
inicio
total 0
fin-desde
fin-desde
fin-desde
total 0
total2 0
fin-desde
escribir („ el promedio en física es: „, total/10, „ el promedio en matemática es:‟, total2/ 10)
fin
Ejemplo 2) Se desea crear un algoritmo en pseudocódigo que permita leer una tabla con
temperaturas. La tabla tiene 5 filas correspondientes a 5 momentos distintos del día, y tiene 3
columnas correspondientes a 3 días distintos. Se desea detectar la temperatura mínima y la
máxima de la tabla completa. Mostrar los valores hallados por pantalla.
Algoritmo Muestra_mín_máx
tipo
var
matriz : mat
entero: i, j
real: mi, ma
fin-desde
fin-desde
ma mat [1, 1]
mi mat [1, 1]
ma mat [i, j]
fin-si
mi mat [i, j]
fin-si
fin-desde
fin-desde
mostrar („la temperatura mínima es: „, mi, „la temperatura máxima es:‟, ma)
fin
Algoritmo Muestra_positivos
tipo
var
matriz : ma
inicio
leer (cant_f)
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
fin-desde
fin-desde
cont 0
desde i 1 hasta cant_f hacer // se recorre los datos del arreglo lineal
cont cont + 1
fin-si
fin-desde
fin-desde
fin
Ejemplo 4) Se desea crear un algoritmo en pseudocódigo que permita sumar los contenidos de
dos tablas de 5x 5 cada una. El resultado se almacenara en otra tabla de la misma dimensión.
Luego recorrer la tabla suma para mostrar los valores por pantalla.
Algoritmo suma_tablas
tipo
var
Materia: Programación Lógica
entero: i, j
inicio
fin-desde
fin-desde
fin-desde
fin-desde
fin-desde
fin-desde
fin-desde
fin-desde
fin
Algoritmo Muestra_fila
tipo
var
dato : ar
entero: i, j, fila
inicio
fin-desde
fin-desde
repetir
leer ( fila)
fin-desde
fin-desde
fin
Algoritmo Suma_fila_columna
tipo
var
Mat : ma
entero: i, j, suma
inicio
fin-desde
fin-desde
Suma 0
fin-desde
vect1[i] suma
suma 0
fin-desde
Suma 0
fin-desde
vect1[j] suma
suma 0
fin-desde
mostrar ( vect1 [ i ])
fin-desde
mostrar ( vect2 [ i ])
fin-desde
fin
Ejemplo 2) Crear una tabla de 4 x4. Declarar un arreglo unidimensional, en el se guardarán los
elementos de la diagonal principal. Luego mostrar por pantalla los elementos del arreglo lineal.
Algoritmo vector-diagonal
tipo
var
Mat : ma
vector: vec1
entero: i, j
inicio
fin-desde
fin-desde
fin-desde
//se muestran por pantalla los elementos del vector diagonal principal
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
var
entero: i, N
inicio
leer (N )
leer ( origen [i ])
fin-desde
Materia: Programación Lógica
Suma 0
fin-desde
media suma / N
j0
j j+1
destino [j ] origen [ i]
fin-si
fin-desde
escribir ( origen [i ])
fin-desde
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
var
entero: i, cant
cadena: nom
inicio
repetir
leer (N )
leer ( vec [i ])
fin-desde
cant 0
leer ( nom)
si-no
fin-si
fin-desde
cant cant + 1
fin-miesntras
fin
Bibliografía Obligatoria:
El ordenamiento es una labor común 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 información de una manera especial basándonos en un criterio
de ordenamiento. La finalidad de un ordenamiento, es el de facilitar el acceso a la información.
En la computación el ordenamiento de datos también cumple un rol muy importante, ya sea como
un fin en sí o como parte de otros procedimientos más complejos. Se han desarrollado muchas
técnicas en este ámbito, cada una con características específicas, y con ventajas y desventajas
sobre las demás. En esta unidad vamos a mostrar algunas de las más 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,
dirección y teléfono se puede ordenar alfabéticamente de acuerdo a la clave nombre. En este
caso los campos dirección y teléfono no se toman en cuenta en el ordenamiento.
Registro: Un grupo de datos que forman la lista. Pueden ser datos atómicos (enteros, caracteres,
reales, etc.) o grupos de ellos.
Cuando se estudian algoritmos de todo tipo, no sólo de ordenamiento, es bueno tener una forma
de evaluarlos antes de pasarlos a código, que se base en aspectos independientes de la
plataforma o el lenguaje. De esta manera podremos decidir cuál se adapta mejor a los
requerimientos de nuestro programa. Algunos de estos aspectos son:
Tiempo de ejecución: Este parámetro mide la complejidad del algoritmo, que no tiene que
ver con dificultad, sino con rendimiento. Es una función independiente de la
implementación.
Ahora podemos decir que un algoritmo de complejidad O(n) es más rápido 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 cómo se le entregue la
información; por eso es conveniente estudiar su comportamiento en casos extremos, como
cuando los datos están prácticamente ordenados o muy desordenados.
Hay más aspectos que se pueden tener en cuenta para realizar un análisis de calidad sobre un
algoritmo de ordenamiento en particular, pero sólo vamos a mencionar en esta materia los hasta
aquí descriptos.
¿Qué grado de orden tendrá la información que vas a manejar? Si la información 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 más indicado. Si por forma en que se presenta la información no es
posible hacer una presunción sobre el grado de orden de la información, lo mejor será elegir un
algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos.
¿Qué tipo de datos quieres ordenar? Algunos algoritmos sólo funcionan con un tipo específico
de datos (enteros, enteros positivos, etc.) y otros son generales, es decir, aplicables a cualquier
tipo de dato.
¿Qué tamaño tienen los registros de tu lista? Algunos algoritmos realizan múltiples
intercambios (burbuja, inserción). Si los registros son de gran tamaño estos intercambios son más
lentos.
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 numérico, alfabético o incluso
alfanumérico, ascendente o descendente.
Tipos de ordenamientos
a- internos
Los datos a ordenar están 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 métodos
que explícitamente pide desarrollar el programa y otros que no se trabajan en la materia, como
para presentar un panorama amplio del ordenamiento
Inserción Directa
Inserción Directa
Inserción Binaria
Burbuja
Intercambio Directo
Shake
Heap
Ordenamiento De Árbol
Tournament
Merge Sort
Radix Sort
Cálculo De Dirección
b- externos
Straight Merging
Natural Merging
Polyphase Sort
Inserción Directa
Shell
Algoritmos de inserción:
Inserción Binaria
Hashing
Burbuja
Algoritmos de intercambio: Shake
QuickSort
Merge
Algoritmos de enumeración: Radix
Heap
Los métodos simples son: Inserción Directa, Selección, Burbuja y Shell, en dónde el último es una
extensión al método de Inserción, siendo más rápido. Los métodos más complejos son Quick Sort
y Heap.
Los métodos de ordenamiento directos, son aquellos que para realizar el ordenamiento utilizan el
espacio del arreglo.
Materia: Programación Lógica
Prácticamente todas las organizaciones tienen información a ordenar y en muchos casos son
grandes volúmenes de datos. El ordenamiento de datos es un problema interesante que ha
provocado áreas de investigaciones en la ciencia de la computación.
Intercambio
Selección
Inserción
3. Repetir estas operaciones con los n-2 elementos restantes hasta que sólo quede el mayor
120 45 2 36 89 90 23
El método busca el más pequeño, y lo intercambia con el elemento que ocupa la primera posición
2 45 120 36 89 90 23
Luego busca el número más pequeño entre los que quedan menos el primer elemento que ya está
ubicado.
2 23 120 36 89 90 45
2 23 36 120 89 90 45
2 23 36 45 89 90 120
Materia: Programación Lógica
2 23 36 45 89 90 120
2 23 36 45 89 90 120
2 23 36 45 89 90 120
Algoritmo ordenación_selección
tipo
var
vector: vec
entero: i, j, aux
inicio
escribir („ ingresar los valores 2, 23, 36, 45, 89, 90, 120‟)
leer (vec [i ] )
fin-desde
vec [i ] vec [ j ]
vec [j ] aux
fin-si
fin-desde
fin-desde
mostrar ( vec [ i ])
fin-desde
fin
Si se quisiese ordenar en forma decreciente los elementos, sólo habría que dar vuelta el signo de
la desigualdad:
vec [i ] vec [ j ]
vec [j ] aux
Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces.
Complejidad O(n2).
Ventajas:
Fácil implementación.
Desventajas:
Lento.
Numerosas comparaciones.
EJEMPLO PRACTICO
67 90 30 21 4 51
67 90 30 21 4 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 4 51
67 90 90 21 4 51 aux= 30
67 67 90 21 4 51
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 inserción.
30 67 90 21 4 51
Aux = 21
21 67 67 90 4 51
30 30 67 90 4 51
21 30 67 90 4 51
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 inserción.
21 30 67 90 4 51
Aux = 4
21 30 67 67 90 51
21 30 30 67 90 51
21 21 30 67 90 51
4 21 30 67 90 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 inserción.
Materia: Programación Lógica
Aux = 51
4 21 30 67 90 90
4 21 30 67 67 90
4 21 30 51 67 90
fin-desde
algoritmo orden_inserción-directa
//declaraciones
inicio
……
aux X [ i]
k i-1
sw falso
X [k +1] X [k ]
K k-1
si-no
sw verdadero
fin-si
X [k +1] aux
fin-desde
fin
Existe una forma de mejorar el algoritmo de inserción lineal o directa. Para ello se utiliza el método
de buscada binaria para ubicar la posición correcta y no realizar un desplazamiento lineal.
algoritmo orden_inserción_binaria
//declaraciones
inicio
……
aux X [ i]
P 1 //primero
U i -1 // ultimo
C ( P+ U) div 2
UC-1
si-no
P C +1
fin-si
fin-mientras
X [k +1] X [ K ]
fin-desde
X [ P ] aux
fin-desde
fin
BubbleSort recorre el arreglo intercambiando los elementos adyacentes que estén desordenados.
Recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente 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 ejecución: El ciclo interno se ejecuta n veces. El ciclo externo también 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 sólo un poco mejor que el del peor caso, y sigue siendo O(n2).
Ventajas:
Fácil implementación.
Desventajas:
Muy lento.
Muchas comparaciones.
Muchos intercambios.
algoritmo Método_Burbuja
//declaraciones
inicio
leer ( vec[ i ] )
fin-desde
//intercambiar
aux vec [ j ]
vec [ j ] vec [ j +1 ]
fin-si
fin-desde
fin-desde
mostrar ( vec[ i ] )
fin-desde
fin
algoritmo Método_Burbuja_mejorada
//declaraciones
inicio
leer ( vec[ i ] )
fin-desde
//intercambiar
Materia: Programación Lógica
vec [ j] vec [ j +1 ]
fin-si
fin-desde
fin-desde
mostrar ( vec[ i ] )
fin-desde
fin
Algoritmo ordenación_selección
tipo
var
vector: vec
entero: i, j, aux
inicio
leer (vec [i ] )
fin-desde
vec [i ] vec [ j ]
vec [j ] aux
fin-si
fin-desde
fin-desde
mostrar ( vec [ i ])
fin-desde
fin
Algoritmo ordenación_selección
tipo
var
vector: vec
entero: i, j, aux
inicio
leer (vec [i ] )
fin-desde
vec [j ] aux
fin-si
fin-desde
fin-desde
mostrar ( vec [ i ])
fin-desde
fin
algoritmo Método_Busqueda_secuencial
//declaraciones
inicio
leer ( vec[ i ] )
leer ( clave)
//búsqueda
ban falso
ban verdadero
fin-si
fin-desde
si-no
fin-si
fin
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 más pequeños, 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 búsqueda binaria utiliza un método de „divide y vencerás‟ para localizar el elemento deseado.
// declaraciones
inicio
// ordenar el arreglo
bajo 1
alto central -1
si-no
bajo central + 1
fin-si
fin-mientras
si K = x [central] entonces
si-no
fin-si
fin
Bibliografía Obligatoria: