Documentos de Académico
Documentos de Profesional
Documentos de Cultura
de Cotopaxi
Universidad Técnica Sistemas de
de Cotopaxi Información
Facultad:
Ciencias de la Ingeniería y Aplicadas. (C.I.Y.A)
Carrera:
Ingeniería en Informática y Sistemas Computacionales.
Ciclo:
Cuarto.
Integrantes:
Barrera Guale Edison Fernando.
Cercado Basurto David Alexander.
Chiguano Guamangate Franklin Isaias.
García Fuentes Janara Aslehy.
Toca Ortega José Wladimir.
Ulloa Latacunga Bryan Alexander.
Asignatura:
Estructura de Datos.
Tema:
Métodos de Ordenamiento:
Burbuja Bidireccional.
Shell Sort.
Docente:
Ing. John Cruz.
Periodo Académico:
Marzo – Agosto 2019.
Extensión La Maná
INTRODUCCIÓN
Muchas actividades humanas requieren que en ellas las diferentes colecciones de elementos
mensajería ordenan el correo y los paquetes por códigos postales con el objeto de conseguir
una entrega eficiente; los anuarios o listines telefónicos ordenan sus clientes por orden
deseado; los estudiantes de una clase en la universidad se ordenan por sus apellidos o por los
números de expediente, etc. Por esta circunstancia una de las tareas que realizan más
varios métodos para ordenar las diferentes estructuras de datos básicas en el momento de
guardar información.
En general los métodos de ordenamiento no son utilizados con frecuencia, en algunos casos
sólo una vez. Hay métodos muy simples de implementar que son útiles en los casos en dónde
el número de elementos a ordenar no es muy grande ya que no ser muy factible al momento
de ponerlo en práctica. Por otro lado, hay métodos sofisticados, más complicados de
Los métodos simples son: insertion sort (o por inserción directa) selection sort, bubble sort, y
shellsort, en dónde el último es una extensión al insertion sort, siendo más rápido. Los
métodos más complejos son el quick-sort y sort, radix. El ordenar un grupo de datos significa
mover los datos o sus referencias para que queden en una secuencia tal que represente un
descendente.
OBJETIVO
Lograr el entendimiento de cada tema que se dio a conocer en todo el semestre, realizando un
proyecto que está basado en una estructura de datos, en la cual se ha aplicado los
conocimientos adquiridos en este semestre, para poder darnos cuenta que cada tema
DESARROLLO
Método de Ordenamiento
Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar información
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
Método burbuja
hasta que todos se encuentren ordenados Se realizan (n-1) pasadas, transportando en cada de
las mismas el menor o mayor elemento (según sea el caso) a su posición ideal.
algoritmo que se aplica para poder ordenar una cantidad de datos ya sea de forma ascendente
o descendente”.
procesamiento, ya que este método evalúa los datos muchas veces y en ocasiones
número hasta encontrar uno mayor, si este es realmente el mayor de todo el vector se llevará
hasta la última casilla, si no es así, será reemplazado por uno mayor que él. § Este
procedimiento seguirá así hasta que haya ordenado todas las casillas del vector. § Una de las
deficiencias del algoritmo es que ya cuando a ordenado parte del vector vuelve a compararlo
Dado un vector a1, a2, a3, ... an 1) Comparar a1 con a2 e intercambiarlos si a1>a2 (o a12) 2)
Seguir hasta que todo se haya comparado an-1 con an 3) Repetir el proceso anterior n-1 veces
aux=vec[j]; T(1)
vec[j]=vec[j+1]; T(1)
vec[j+1]=aux;} T(1)
Implementación en C:
v[i] = v[j];
v[j] = temp
}
}
https://www.ecured.cu/Ordenamiento_de_burbuja
Burbuja Bidireccional
Según [CITATION And16 \l 12298 ], nos dice que el método de ordenamiento de
dos extremos del vector. De manera que, tras la primera iteración, tanto el menor
como el mayor elemento estarán en sus posiciones finales. De esta manera se reduce
lugares.
Navarro, A. (2016). Proceso de Ordenamiento [Figura 3]. Recuperado de
https://juncotic.com/ordenamiento-de-burbuja-bidireccional-algoritmos-de-ordenamiento/
Navarro, A. (2016). Proceso de Ordenamiento [Figura 5]. Recuperado de
https://juncotic.com/ordenamiento-de-burbuja-bidireccional-algoritmos-de-ordenamiento/
número comparado.
No es posible realizar más iteraciones ya que no quedan dos números sin ordenar
Inserción
Explica [ CITATION Ala08 \l 12298 ] que este método se podría decir que es algo superior
al método de la burbuja, ya que logra evaluar menos veces la condición. Sin embargo, aún es
un algoritmo muy pobre y que utiliza recursos técnicamente igual que el algoritmo burbuja.
El algoritmo consiste en ordenar los dos primeros elementos de la matriz, luego se inserta el
tercer elemento en la posición correcta con respecto a los dos primeros, a continuación, se
inserta el cuarto elemento en la posición correcta con respecto a los tres primeros elementos
a. Repetir mientras (aux < [k]) y (k > 1) , Hacer A[k+1]<- A[k] y k<-- k-1
Implementación en C
int i, a, index;
index = numbers[i];
a = i-1;
numbers[a + 1] = numbers[a];
a--;
numbers[a+1] = index;
Este algoritmo también es bastante sencillo. ¿Has jugado cartas? ¿Cómo las vas ordenando
cuando las recibes? Yo lo hago de esta manera: tomo la primera y la coloco en mi mano. Luego
tomo la segunda y la comparo con la que tengo: si es mayor, la pongo a la derecha, y si es menor
a la izquierda (también me fijo en el color, pero omitiré esa parte para concentrarme en la idea
principal). Después tomo la tercera y la comparo con las que tengo en la mano, desplazándola
posición que le corresponde, hasta que las tengo todas en orden. ¿Lo haces así tú también?
Bueno, pues si es así entonces comprenderás fácilmente este algoritmo, porque es el mismo
concepto.
Para simular esto en un programa necesitamos tener en cuenta algo: no podemos desplazar los
elementos, así como así o se perderá un elemento. Lo que hacemos es guardar una copia del
elemento actual (que sería como la carta que tomamos) y desplazar todos los elementos mayores
hacia la derecha. Luego copiamos el elemento guardado en la posición del último elemento que
se desplazó.
Selección
menor de todos los elementos del arreglo o vector e intercambiarlo con el que está en la
primera posición. Luego el segundo más pequeño, y así sucesivamente hasta ordenarlo todo.
de elementos.
Este algoritmo mejora ligeramente el algoritmo de la burbuja. En el caso de tener que ordenar un
vector de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector de
estructuras más complejas, la operación de intercambiar los elementos sería más costosa en este
caso.
Según [ CITATION Bar11 \l 12298 ] Puede que exista algo de discrepancia en cuanto a si es o no
estable este algoritmo, pero en realidad esta implementación parece ser bastante estable. Se puede
verificar esto ordenando un conjunto de datos que tenga un par de ellos con la misma clave. Se
Algunos autores no lo consideran así, pero independientemente de esto, este algoritmo tienes
entre sus ventajas: Es fácil su implementación. No requiere memoria adicional. Realiza pocos
intercambios. Tiene un rendimiento constante, pues existe poca diferencia entre el peor y el mejor
caso. Como todos también tiene algunas desventajas: Es lento y poco eficiente cuando se usa en
Implementación en C:
int minimo=0,i,j;
int swap;
minimo=i;
minimo=j;
swap=x[minimo];
x[minimo]=x[i];
x[i]=swap;
}}
Este ordenamiento se basa en los valores de los dígitos reales en las representaciones de
Empezar en el dígito más significativo y avanzar por los dígitos menos significativos
El número con el dígito más grande en la primera posición en la cual los dígitos de los
dos números no coinciden es el mayor de los dos (por supuesto sí coinciden todos los
Este mismo principio se toma para Radix Sort, para visualizar esto mejor tenemos el
Demostración:
Vector: 25 57 48 37 12 92 86 33
2 12 92
3 33
5 25
6 86
7 57 37
8 48
10
12 92 33 25 86 57 37 48
1 12
2 25
3 33 37
4 48
5 57
8 86
9 92
10
Vector Ordenado: 12 25 33 37 48 57 86 92
Ventajas
es demasiado grande.
Si las máquinas tienen la ventaja de ordenar los dígitos (sobre todo si están en binario)
lo ejecutarían con mucho mayor rapidez de lo que ejecutan una comparación de dos
llaves completas.
Shell Sort
considera que el método Shell es una mejora de los métodos de inserción directa. En
su izquierda, uno tras otro. Si el elemento a insertar es el más pequeño hay que
de Shell modifica los saltos contiguos resultantes de las comparaciones por saltos de
mayor tamaño y con ello se consigue que la ordenación sea más rápida. Generalmente
se toma como salto inicial n/2 (siendo n el número de elementos), luego se reduce el
siguiente ejemplo, ordena una lista de elementos siguiendo paso a paso el método de
Shell.
Estructura de Datos. (s.f). Ejemplo Ordenamiento Shell [Figura 7]. Recuperado de
http://novella.mhhe.com/sites/dl/free/844814077x/619434/A06.pdf
Los pasos a seguir por el algoritmo para una lista de n elementos son:
Por consiguiente, los recorridos por la lista están condicionados por el bucle,
Estructura de Datos. (s.f). Comparación de Elementos Indexados [Figura 8]. Recuperado de
http://novella.mhhe.com/sites/dl/free/844814077x/619434/A06.pdf
primer valor de intervalo = 4, y los índices i =5, j =1, k =6. Los siguientes valores
intervalo intervalo / 2
Ventaja
Desventaja
y Quick Sort.
operador, /, realiza una división entera si los operandos son enteros, y esto es
importante al calcular el ancho del salto entre pares de elementos: intervalo = n/2.
QUICK SORT
n. Esta es la técnica de ordenamiento más rápida conocida. Fue desarrollada por C. Antony R.
Hoare en 1960. El algoritmo original es recursivo, pero se utilizan versiones iterativas para
mejorar su rendimiento (los algoritmos recursivos son en general más lentos que los
Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un
lado queden todos los menores que él, y al otro los mayores. Los elementos iguales al
La lista queda separada en dos sublistas, una formada por los elementos a la izquierda
Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan
más de un elemento. Una vez terminado este proceso todos los elementos estarán
ordenados.
el pivote elegido.
En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos
n).
implementado toma como pivote siempre el primer elemento del array, y el array que le
ineficiente.
en la elección del pivote.
Merge Sort
El algoritmo de ordenamiento por mezcla (merge sort en inglés) es un algoritmo de
principal de la computadora (RAM) y un tipo de memoria más lenta (Disco Duro) tiene que
otra vez hasta que cada pieza tenga solo un elemento de longitud. Luego esos elementos se
function mergesort(m)
if length(m) ≤ 1
return m
Una técnica muy poderosa para el diseño de algoritmos es "Dividir para conquistar". Los
algoritmos de este tipo se caracterizan por estar diseñados siguiendo estrictamente las
siguientes fases:
Los algoritmos que utilizan este principio son en la mayoría de los casos netamente
algoritmo que utiliza el principio de dividir para conquistar. Si el vector tiene más de dos
elementos se lo divide en dos mitades, se invoca recursivamente al algoritmo y luego se hace
Colas
Una cola es un tipo especial de lista abierta en la que sólo se pueden insertar nodos en uno de
los extremos de la lista y sólo se pueden eliminar nodos en el otro. Además, como sucede con
las pilas, las escrituras de datos siempre son inserciones de nodos, y las lecturas siempre
Este tipo de lista es conocido como lista FIFO (First In First Out), el primero en entrar es el
primero en salir.
http://programacion-de-lenguaje.blogspot.com/2015/05/colas-en-c.html
El símil cotidiano es una cola para comprar, por ejemplo, las entradas del cine. Los nuevos
compradores sólo pueden colocarse al final de la cola, y sólo el primero de la cola puede
comprar la entrada.
El nodo típico para construir pilas es el mismo que vimos en los capítulos anteriores para la
struct nodo {
int dato;
struct nodo *siguiente;
};
Los tipos que definiremos normalmente para manejar colas serán casi los mismos que para
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Cola;
Es evidente, a la vista del gráfico, que una cola es una lista abierta. Así que sigue siendo muy
importante que nuestro programa nunca pierda el valor del puntero al primer elemento, igual
que pasa con las listas abiertas. Además, debido al funcionamiento de las colas, también
deberemos mantener un puntero para el último elemento de la cola, que será el punto donde
Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre en extremos
distintos, lo más fácil será insertar nodos por el final, a continuación del nodo que no tiene
nodo siguiente, y leerlos desde el principio, hay que recordar que leer un nodo implica
eliminarlo de la cola.
PILAS
Una pila es un tipo especial de lista abierta en la que sólo se pueden insertar y eliminar nodos
en uno de los extremos de la lista. Estas operaciones se conocen como "push" y "pop",
respectivamente "empujar" y "tirar". Además, las escrituras de datos siempre son inserciones
Pilas estáticas
Se les llama pilas estáticas puesto que su tamaño se define al momento de su creación y no
puede ser cambiado luego. Este tipo de pilas se implementa con arreglos.
Pilas dinámicas
Las pilas dinámicas trabajan en estructuras que se enlazan para formar la pila, como crear
estas estructuras solo depende de la cantidad de memoria de la que dispone nuestra máquina
podemos crear y enlazar casi tantas como queramos. De ahí el nombre de dinámicas.
https://es.ccm.net/faq/2885-las-pilas-en-lenguaje-c
Operaciones de la Pila
Las pilas tienen algunas operaciones básicas que rigen su uso, a saber:
new (crear): esta operación crea e inicializa una pila haciendo posible el empezar a
usarla.
No importa que tipo de elementos contenga nuestra pila, las operaciones son exactamente
iguales. De la misma forma que en el mundo real no importa si la pila es de platos, libros,
cajas, revistas, periódicos… siempre colocamos el último elemento al tope de la pila, y ese
último elemento es el primero que vamos a tomar a la hora de sacar. Ahora bien, si deseamos
abstraer una pila a cualquier lenguaje de programación debemos también respetar la regla o
El símil del que deriva el nombre de la estructura es una pila de platos. Sólo es posible añadir
platos en la parte superior de la pila, y sólo pueden tomarse del mismo extremo.
El nodo típico para construir pilas es el mismo que vimos en el capítulo anterior para la
construcción de listas:
struct nodo {
int dato;
struct nodo *siguiente;
};
Los tipos que definiremos normalmente para manejar pilas serán casi los mismos que para
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Pila;
Listas ligadas
La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada, al
igual que los vectores, pero, a diferencia de estos, esta estructura es dinámica, por lo que no
tenemos que saber "a priori" los elementos que puede contener.
Según[ CITATION Ber09 \l 12298 ] Al contrario que las pilas y las colas las listas enlazadas
pueden acceder a una zona de memoria de forma aleatoria, ya que cada trozo de información
En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene
sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el
dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen recibir
struct lista {
gint dato;
lista *siguiente;
};
Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores asociados que
permitan la manipulación de los datos que contiene. Los operadores básicos de una lista
enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al
Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.
Las listas enlazadas se utilizan principalmente para dos propósitos, crear arrays de un tamaño
desconocido en memoria, y los archivos de almacenamiento en disco para bases de datos, las
Las listas pueden ser simplemente enlazadas o doblemente enlazadas, las simplemente
Una lista simplemente enlazada necesita que cada elemento contenga un enlace con el
punteros de enlace.
Existen dos formas de construir una lista simplemente enlazada , la primera es añadir un
nuevo elemento al principio o al final de la lista, la otra añade los elementos en un punto
especifico de la lista.
Si la lista ya está ordenada, es conveniente mantenerla así, insertando los nuevos elementos
en su lugar apropiado para lo cual se explora la lista de forma secuencial hasta encontrar el
lugar apropiado, la nueva dirección se inserta en ese punto y los enlaces se vuelven a colocar
Se pueden dar tres posibles situaciones al insertar un elemento en una lista enlazada
Tener en cuenta que al cambiar el primer elemento hay que actualizar el punto de entrada en
más que el primer elemento no cambia nunca con un valor especial, con lo que siempre será
el primer elemento de la lista, pero se necesita una posición más de memoria. Para recuperar
un elemento de la lista es como seguir una cadena, una rutina basada en el campo nombre.
Para borrar un elemento al igual que para insertar un elemento se pueden dar los mismos tres
función tiene que devolver un puntero al comienzo de la lista para que cuando se borre el
primer elemento de la lista, el programa conozca la dirección del nuevo primer elemento de la
lista. Las listas simplemente enlazadas solo se pueden recorrer en sentido ascendente y no en
sentido descendente, para lo cual se pueden utilizar las listas doblemente enlazadas.
Listas doblemente enlazadas.
Las listas doblemente enlazadas consisten en datos y enlaces tanto al elemento siguiente
como al elemento anterior. Con lo que se consiguen dos grandes ventajas, primero la lista se
puede leer en cualquier dirección, la segunda es que se pueden leer los enlaces hacia delante
como hacia atrás, con lo que si un enlace resulta no valido se puede reconstruir utilizando el
otro enlace.
Como en las listas simplemente enlazadas, las doblemente enlazadas pueden contener una
función que almacene cada elemento en una posición especifica de la lista a medida que esta
Árbol binario
En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el
valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol
izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el
recorrido con este método seria seguir el orden: nodo raíz, nodo izquierda, nodo derecha.
En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo
actual. Otra forma para entender el recorrido con este método seria seguir el orden: nodo
izquierda, nodo derecha, nodo raíz. En el árbol de la figura el recorrido en post orden sería: 2,
5, 11, 6, 7, 4, 9, 5 y 2.
void postorden(tArbol *a)
{
if (a != NULL) {
postorden(a->hIzquiedo);
postorden(a->hDerecho);
tratar(a); //Realiza una operación en nodo
}
}
Recorrido en in orden
En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el
subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a
mayor. Otra forma para entender el recorrido con este método seria seguir el orden: nodo
izquierda, nodo raíz, nodo derecha. En el árbol de la figura el recorrido en in orden sería: 2, 7,
5, 6, 11, 2, 5, 4, 9.
Un trie es una estructura de datos de tipo árbol que permite la recuperación de información
(de ahí su nombre del inglés reTRIEval). La información almacenada en un trie es un
conjunto de claves, donde una clave es una secuencia de símbolos pertenecientes a un
alfabeto. Las claves son almacenadas en las hojas del árbol y los nodos internos son pasarelas
para guiar la búsqueda. El árbol se estructura de forma que cada letra de la clave se sitúa en
un nodo de forma que los hijos de un nodo representan las distintas posibilidades de símbolos
diferentes que pueden continuar al símbolo representado por el nodo padre. Por tanto la
búsqueda en un trie se hace de forma similar a como se hacen las búsquedas en un
diccionario:
Por eficiencia se suelen eliminar los nodos intermedios que sólo tienen un hijo, es decir, si un
nodo intermedio tiene sólo un hijo con cierto carácter entonces el nodo hijo será el nodo hoja
que contiene directamente la clave completa.
Es muy útil para conseguir búsquedas eficientes en repositorios de datos muy voluminosos.
La forma en la que se almacena la información permite hacer búsquedas eficientes de cadenas
que comparten prefijos.
CONCLUSIÓN:
En la vida cotidiana no es muy común utilizar el método de ordenamiento, pero sin
para este tipo de búsquedas tiene que ser un método eficiente he utilizable que no
realizar este proyecto ya que nos ha sido muy útil poner en práctica nuestros
dedicación.
Bibliografía
Amey, P. (2016). Closing the loop - the influence of code analysis on desing. Vietna : Ada - Europe.
Andrea Navarro. (25 de Octubre de 2016). Junco TIC. Obtenido de Ordenamiento de burbuja
bidireccional - Algoritmos de ordenamiento - Junco TIC: https://juncotic.com/ordenamiento-
de-burbuja-bidireccional-algoritmos-de-ordenamiento/
Burns, A., & Wellings, A. (2008). Sistemas de tiempo real y lenguajes de programación , 3rd Edición.
Addison Wesley.
Joshtyn Mejias. (19 de Octubre de 2013). PREZI. Obtenido de METODO DE ORDENAMIENTO SHELL
SORT: https://prezi.com/rpa3rqilg-bz/metodo-de-ordenamiento-shell-sort/
Knuth, D. (2012). The art of computer programming , vol 3 : Sorting and searching. Addison - Wesley.
Mc Graw Hill Education. (15 de Mayo de 2019). Algoritmos y Estructuras de Datos. Obtenido de
Algoritmos de Ordenación y Búsqueda:
http://novella.mhhe.com/sites/dl/free/844814077x/619434/A06.pdf