Está en la página 1de 30

PROYECTO FINAL

JULIETH PAOLA PACHÓN LÓPEZ


KAREN LORENA RUIZ

INGENIERÍA DE SISTEMAS

BOGOTÁ DC,25/05/2020 DEL 2020

1
PROYECTO FINAL

MÉTODOS DE ORDENAMIENTO MERGE SORT Y BURBUJA

JULIETH PAOLA PACHÓN LÓPEZ


KAREN LORENA RUIZ

DOCENTE:FREDERICK FERRO

INGENIERÍA DE SISTEMAS

BOGOTÁ DC,25/05/2020 DEL 2020

2
AGRADECIMIENTOS

El presente trabajo investigativo y de desarrollo de algoritmos de ordenamiento


fusionado,lo dedicamos principalmente a Dios, por ser el inspirador y darnos
fuerza y paciencia para continuar en este proceso de obtener uno de los
anhelos más deseados a lo largo de nuestra carrera universitaria.

A nuestros padres, por su amor, trabajo y sacrificio en todos estos años,


gracias a ustedes hemos logrado llegar hasta aquí y convertirnos en lo que
somos. Ha sido el orgullo y el privilegio de ser sus hijas, son los mejores
padres y los honramos por eso.

Agradecemos a nuestros docentes de la Universidad Central, por haber


compartido sus conocimientos a lo largo de la preparación de nuestra profesión
de Ingeniería de sistemas,por ir a veces más allá de su labor como docentes.

3
TABLA DE CONTENIDO

1. Portada y contraportada………………………………………………….
2. Agradecimientos………………………………………………………..
3. Tabla de contenido……………………………………………………..
4. Tabla de figuras ………………………………………………………..
5. Tabla de datos………………………………………………………….
6. Introducción…………………………………………………………...
7. Objetivos……………………………………………………………..
a. General………………………………………………………...
b. Específico……………………………………………………..
8. Marco teórico………………………………………………………….
9. Metodología………………………………………………………….
a. Análisis del problema………………………………………...
b. Diseño………………………………………………………...
c. Implementación……………………………………………...
d. Pruebas………………………………………………………..
10.Conclusiones………………………………………………………..
11.Bibliografía…………………………………………………………….

4
TABLA DE FIGURAS

● Figura No.1 cuadro de descripción del método burbuja


● Figura No.2 diagrama de descripción del método merge sort
● Figura No.3 descripción de implementacion de ordenamiento burbuja a mano con 10 datos
random
● Figura No.4 descripción de implementacion de ordenamiento mergesort a mano con 10
datos
● Figura No.5 descripción de diseño con burbuja y merge sort
● Figura No.6 descripción de diseño con burbuja y merge sort paso a paso
● Figura No.7 Gráfica de toma de tiempos entre vector 4-10
● Figura No.8 Gráfica de toma de tiempos entre vector 10-50
● Figura No.9 Gráfica de toma de tiempos entre vector 4-50

5
TABLA DE DATOS

● Tabla de datos No.1 Datos de tiempo con 10 datos a ordenar con burbuja
● Tabla de datos No.2 Datos de tiempo con 100 datos a ordenar con burbuja
● Tabla de datos No.3 Datos de tiempo con 500 datos a ordenar con burbuja
● Tabla de datos No.4 Datos de tiempo con 1000 datos a ordenar con burbuja
● Tabla de datos No.5 Datos de tiempo con 5000 datos a ordenar con burbuja
● Tabla de datos No.6 Datos de tiempo con 10000 datos a ordenar con burbuja
● Tabla de datos No.7 Datos de tiempo con 50000 datos a ordenar con burbuja
● Tabla de datos No.8 Datos de tiempo con 100000 datos a ordenar con burbuja
● Tabla de datos No.9 Datos de tiempo con 250000 datos a ordenar con burbuja
● Tabla de datos No.10 Datos de tiempo con 10 datos a ordenar con merge sort
● Tabla de datos No.11 Datos de tiempo con 100 datos a ordenar con merge sort
● Tabla de datos No.12 Datos de tiempo con 500 datos a ordenar con merge sort
● Tabla de datos No.13 Datos de tiempo con 1000 datos a ordenar con merge sort
● Tabla de datos No.14 Datos de tiempo con 5000 datos a ordenar con merge sort
● Tabla de datos No.15 Datos de tiempo con 10000 datos a ordenar con merge sort
● Tabla de datos No.16 Datos de tiempo con 50000 datos a ordenar con merge sort
● Tabla de datos No.17 Datos de tiempo con 100000 datos a ordenar con merge sort
● Tabla de datos No.18 Datos de tiempo con 250000 datos a ordenar con merge sort
● Tabla de datos No.19 Datos de tiempo de un vector mínimo de 4
● Tabla de datos No.20 Datos de tiempo de un vector mínimo de 5
● Tabla de datos No.21 Datos de tiempo de un vector mínimo de 6
● Tabla de datos No.22 Datos de tiempo de un vector mínimo de 7
● Tabla de datos No.23 Datos de tiempo de un vector mínimo de 8
● Tabla de datos No.24 Datos de tiempo de un vector mínimo de 9
● Tabla de datos No.25 Datos de tiempo de un vector mínimo de 10
● Tabla de datos No.26 Datos de tiempo de un vector mínimo de 10 segunda parte
● Tabla de datos No.27 Datos de tiempo de un vector mínimo de 11
● Tabla de datos No.28 Datos de tiempo de un vector mínimo de 13
● Tabla de datos No.29 Datos de tiempo de un vector mínimo de 15
● Tabla de datos No.30 Datos de tiempo de un vector mínimo de 20
● Tabla de datos No.31 Datos de tiempo de un vector mínimo de 25
● Tabla de datos No.32 Datos de tiempo de un vector mínimo de 30
● Tabla de datos No.33 Datos de tiempo de un vector mínimo de 35
● Tabla de datos No.34 Datos de tiempo de un vector mínimo de 40
● Tabla de datos No.35 Datos de tiempo de un vector mínimo de 45
● Tabla de datos No.36 Datos de tiempo de un vector mínimo de 50
● Tabla de datos No.37 Tabla de datos y su promedio de 4 al 50

6
INTRODUCCIÓN

La ordenación o clasificación es el proceso de organizar datos en algún orden o secuencia


específica, tal como creciente o decreciente, para datos numéricos, o alfabéticos, para datos
de caracteres. Los métodos de ordenación más directos son los que se realizan en el espacio
ocupado por el array.

La mayoría de los datos producidos por un programa están ordenados de alguna manera, y
muchos de los cómputos que tiene que realizar un programa son más eficientes si los datos
sobre los que operan están ordenados. Uno de los tipos de cómputo que más se benefician
de operar sobre un conjunto de datos ordenados es la búsqueda de un dato: encontrar el
número de teléfono de una persona en un listín telefónico es una tarea muy simple y rápida
si conocemos su nombre, ya que los listines telefónicos se encuentran ordenados
alfabéticamente. Encontrar a qué usuario corresponde un número de teléfono dado, sin
embargo, es una tarea prácticamente inabordable.

En este proyecto se implementaron dos métodos de estos, con el objetivo de realizar un


algoritmo experimental,simple y de alto rendimiento,estos dos métodos de ordenamiento
que son mergesort y burbuja,haciendo el debido ordenamiento con una cantidad n de datos.
La idea es comparar el rendimiento de los algoritmos de ordenamiento vistos en clase. Una
vez hechas las pruebas experimentales se realiza un análisis de los resultados.

7
OBJETIVOS

General

Implementar un algoritmo donde éste una los métodos de ordenamiento


dados(mergesort y burbuja),teniendo en cuenta que el mismo tenga un
ordenamiento eficaz para así poder evidenciar en las pruebas que disminuyó el
ordenamiento de N datos.

Específicos

● Obtener y analizar de datos correspondientes a la solicitud de pruebas


● Realizar el análisis experimental de la implementación de los algoritmos de
burbuja con merge sort
● Razonar sobre datos experimentales
● Analizar los algoritmos previamente implementados

8
MARCO TEÓRICO

● Algoritmo de ordenamiento burbuja


Burbuja(Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona
revisando cada elemento de la lista que va a ser ordenada con el siguiente,
intercambiandolos de posición si están en el orden equivocado. Es necesario revisar varias
veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista
está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista
los elementos durante los intercambios, como si fueran pequeñas burbujas. También es
conocido como el método del intercambio directo. Dado que solo usa comparaciones para
operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de
implementar.[1]

Figura No.1 cuadro de descripción del método burbuja


● Análisis de ordenamiento burbuja
Al algoritmo de la burbuja, para ordenar un vector de n términos, tiene que realizar siempre
el mismo número de comparaciones:

9
Esto es, el número de comparaciones ​c(n) ​no depende del orden de los términos, si no del
número de términos.

Por lo tanto la cota ajustada asintótica del número de comparaciones pertenece al orden de ​n
cuadrado. El número de intercambios ​i(n)​, que hay que realizar depende del orden de los
términos y podemos diferencia, el caso mejor, si el vector está previamente ordenado, y el caso
peor, si el vector está ordenado en orden inverso.

Por lo que no se puede determinar una cota ajustada asintótica del número de intercambios,
dado que este dependerá del orden del vector en cuestión.

● Rendimiento en el caso desfavorable


Si pasamos al algoritmo un vector ordenado en orden inverso realizará un número de
comparaciones.

Como ya hemos dicho anteriormente, y tendrá que realizar un número igual de intercambios
entre los términos del vector, dado que en cada comparación los términos estarán desordenados,
y se realizará el intercambio.

Por lo tanto en el caso más desfavorable tanto el número de comparaciones como el de


intercambios coinciden.El número de comparaciones o de intercambios en el caso más
desfavorable pertenece al orden de ​n​ cuadrado.

● Rendimiento en casos óptimos


En el caso óptimo, el más favorable, es la ordenación que un vector ya ordenado, en este
caso el número de comparaciones será el mismo que en cualquier otro caso.

La cota inferior asintótica del número de comparaciones pertenece al orden de ​un cuadrado,
como en los demás casos, pero en todas las comparaciones el orden es el correcto y por
tanto no se realiza ningún intercambio:

Por lo tanto el coste de intercambios no depende de ​n​, y es constante:

10
El ordenamiento de burbuja tiene una complejidad ​Ω(n²) igual que ordenamiento por
selección. Cuando una lista ya está ordenada, a diferencia del ordenamiento por inserción,
que pasará por la lista una vez y encontrará que no hay necesidad de intercambiar las
posiciones de los elementos, el método de ordenación por burbuja está forzado a pasar por
dichas comparaciones, lo que hace que su complejidad sea cuadrática en el mejor de los
casos. Esto lo cataloga como el ​algoritmo más ineficiente que existe, aunque para muchos
programadores sea el más sencillo de implementar.

● Método de ordenación Merge Sort


El algoritmo de ordenamiento por mezcla (merge sort) es un algoritmo de ordenamiento
externo estable basado en la técnica divide y vencerás. Es de Complejidad O(nlog n).
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:

● Dividir​: Se divide el problema en partes más pequeñas.


● Conquistar​: Se resuelven recursivamente los problemas más chicos.
● Combinar​: Los problemas más chicos de combinan para resolver el grande.

Los algoritmos que utilizan este principio son en la mayoría de los casos netamente
recursivos como es el caso de mergesort.El algoritmo de Mergesort es un ejemplo clásico
de 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 una intercalación de las dos mitades ordenadas.

11
Figura No.2 diagrama de descripción del método mergesort

● Optimizacion del metodo


En los ordenadores modernos, el principio de localidad puede ser primordial en la
optimización de software​, porque se usan ​jerarquías de memoria multi-nivel. Se han
propuesto versiones de caché-consciente del algoritmo de ordenación por mezcla, cuyas
operaciones han sido específicamente escogidas para minimizar el movimiento de entrada y
salida de páginas de la memoria caché de la máquina. Por ejemplo, el algoritmo "tiled
merge sort" deja de particionar subarrays cuando se han alcanzado subarrays de tamaño S,
donde S es el número de elementos que caben en una única página en memoria. Cada uno
de esos subarrays se ordenan con un algoritmo de ordenación in-situ, para evitar
intercambios en memoria, y entonces se termina con el algoritmo de ordenamiento por
mezcla en su versión recursiva estándar. Este algoritmo ha demostrado un mejor
rendimiento en máquinas que se benefician de la optimización caché.
● Comparación con otros algoritmos
Aunque ​heapsort tiene los mismos límites de tiempo que mergesort, requiere sólo Θ(1)
espacio auxiliar en lugar del Θ(​n​) de merge sort, y es a menudo más rápido en
implementaciones prácticas. ​Quicksort​, sin embargo, es considerado por mucho como el
más rápido algoritmo de ordenamiento de propósito general. En el lado bueno, merge sort
es un ordenamiento estable, paraleliza mejor, y es más eficiente manejando medios
secuenciales de acceso lento. Merge sort es a menudo la mejor opción para ordenar una
lista enlazada​: en esta situación es relativamente fácil implementar merge sort de manera

12
que sólo requiera Θ(1) espacio extra, y el mal rendimiento de las listas enlazadas ante el
acceso aleatorio hace que otros algoritmos (como quicksort) den un bajo rendimiento, y
para otros (como heapsort) sea algo imposible.
Para ​Perl 5.8, merge sort es el algoritmo de ordenamiento por defecto (lo era quicksort en
versiones anteriores de Perl). En ​Java los métodos de ordenación de Arrays usan merge sort
o una modificación de quicksort dependiendo de los tipos de datos y por cuestiones de
eficiencia cambian a ​ordenamiento por inserción cuando se están ordenando menos de siete
elementos en el array.[2]

METODOLOGÍA
Análisis del problema
● Ordenamiento burbuja manual
Datos random de 0 al 100 con 10 datos manual
[7, 62, 38, 62, 40, 61, 90, 40, 71, 94]

Figura No.3 descripción ordenamiento burbuja

13
El proceso de ordenamiento con burbuja con el vector 7,62,38,62,40,61,90,40,71,94 fue: el 7 se
comparó con 62,38,62,40,61,90,40,71 y 94 el 7 es menor que todos se queda en su lugar , se
comparó el 62 con 38 es menor 38 se cambia de puesto ,se compara el 62 con 62 y 40 el 40 es
menor se cambia de puesto , se compara 62 con 62,90 y 40 el 40 es menor se cambia de puesto , se
compara 62 con 92,62,71 y 94 es menor se queda en su puesto , se compara el 92 con 62 el 62 es
menor se cambia de puesto , se compara el 92 con 71 el 71 es menor se cambia de puesto , se
compara 92 con 94 el 92 es menor se queda en su puesto de esta forma queda el vector
7,38,40,40,40,62,62,71,92.94.

Código de método burbuja

import​ random
def​ ​bubbleSort​(​lista​):
n = ​len​(lista)

​for​ i ​in​ ​range​(n​-1​):


​for​ j ​in​ ​range​(​0​, n-i​-1​):
​if​ lista[j] > lista[j+​1​] :
lista[j], lista[j+​1​] = lista[j+​1​], lista[j]
bubbleSort(lista)
​return​ lista

lista= [random.randint(​0​,​200​) ​for​ _ ​in​ ​range​(10)]


listafinal = bubbleSort(lista)
print​(​"Lista final Burbuja:"​,listafinal)

14
TOMA DE TIEMPOS

Tabla de datos No.1 Tabla de datos No.2 Tabla de datos No.3

Tabla de datos No.4 Tabla de datos No.5 Tabla de datos No.6

15
Tabla de datos No.7 Tabla de datos No.8 Tabla de datos No.9

● Ordenamiento merge sort


Datos random de 0 al 100 con 10 datos manual
[10, 51, 4, 64, 5, 12, 48, 52, 71]

Figura No.4 descripción de implementacion de ordenamiento merge sort

El proceso de ordenamiento con mergesort se tiene el vector 10,51,4,64,5,12,48,52,71,13 el


proceso consta de dividir el vector en dos el primero queda con 10,51,4,64,5 y el segundo
vector como 12,48,52,71,13 estos vectores se dividen en 4 sub vectores quedan asi 10,51,4
con 64 , 5 los otros 12,48,52 y 71,13 se empieza a comparar los vectores quedarían
4,5,10,51,64 y 12,13,48,52,71 se comparan y los vectores y queda uno solo ordenado
4,5,10,12,13,48,51,52,64,71.

16
Código del método merge sort

import​ random
def​ ​merge_sort​(​lista​):

​if​ ​len​(lista) < ​2​:


​return​ lista

​else​:
middle = ​len​(lista) // ​2
right = merge_sort(lista[:middle])
left = merge_sort(lista[middle:])
​return​ merge(right, left)

# Función merge
def​ ​merge​(​lista1​, ​lista2​):
i, j = ​0​, ​0​ ​# Variables de incremento
result = [] ​# Lista de resultado

​# Intercalar ordenadamente
​while​(i < ​len​(lista1) ​and​ j < ​len​(lista2)):
​if​ (lista1[i] < lista2[j]):
result.append(lista1[i])
i += ​1
​else​:
result.append(lista2[j])
j += ​1

​# Agregamos los resultados a la lista


result += lista1[i:]
result += lista2[j:]
​return​ result

lista = [random.randint(​0​,​100​) ​for​ _ ​in​ ​range​(​10​)]

17
listafinal = merge_sort(lista)
print​(​"Lista final Merge:"​,listafinal)

TOMA DE TIEMPOS

Tabla de datos No.10 Tabla de datos No.11 Tabla de datos No.12

Tabla de datos No.13 Tabla de datos No.14 Tabla de datos No.15

18
Tabla de datos No.16 Tabla de datos No.17 Tabla de datos No.18

Diseño de burbuja con merge

Figura No.5 descripción de diseño con burbuja y merge sort

19
Figura No.6 descripción de diseño con burbuja y merge sort paso a paso

Implementación (código fuente)


#Módulos importados
import​ random
import​ numpy
from​ time ​import​ time
import​ pandas a
​ s​ pd
import​ numpy a
​ s​ np
import​ random a
​ s​ rd
import​ csv
#lectura de los datos
​ Entrada.csv'​,header=0
datos = pd.read_csv(' ​ ​)
#Impresión de datos en matriz
#print(datos)
#lectura de los datos para tener el vector

20
​ Entrada.csv'​)
lista = pd.read_csv('
#inicialización del vector
listaNueva = []
#agregar los datos al vector
listaNueva = lista.values.tolist()
#impresión del vector con los datos
#print("Lista inicial:",listaNueva)
#se lee el archivo csv
​ Entrada.csv'​)
lista = pd.read_csv('
#se convierte lo leído en un dataframe
lista1 = pd.DataFrame(lista)
#se obtienen los valores del data frame, estos serán guardados como
una
#matriz
lista3 = lista1.values;
#se sacan las dimensiones de la matriz
shape2 = lista3.shape
#se instancia la lista que guardará los valores
listaNueva = []
#*********************************************************************
************
for​ i ​in​ ​range(
​ shape2[​0]
​ ):
​ or​ j i
f ​ n​ r
​ ange(
​ shape2[​1​]):
listaNueva.append(lista3[i][j])
​ ​len​(listaNueva))
print(

start_time = time()
def​ m
​ erge_sort(
​ ​lista)
​ :
​ límite de partición del vector
#
​ f​ l
i ​ en(
​ lista) < ​11:

​ en(
n= l ​ lista)
​ or​ i ​in​ r
f ​ ange​(n-
​ 1​):
​for​ j ​in​ ​range(
​ ​0​, n-i​-1)
​ :
​ f​ lista[j] > lista[j+​1​] :
i
lista[j], lista[j+​1]
​ = lista[j+1
​ ​], lista[j]
​ eturn​ lista
r
​ lse​:
e

21
​ en(
middle = l ​ lista) // ​2
right = merge_sort(lista[:middle])
left = merge_sort(lista[middle:])
​ eturn​ merge(right, left)
r

# Función merge
def​ m
​ erge​(l
​ ista1,
​ ​lista2​):
​ ​, 0
i, j = 0 ​ ​ #
​ Variables de incremento
​ Lista de resultado
result = [] #

​# Intercalar ordenadamente
​ hile​(i < l
w ​ en(
​ lista1) a
​ nd​ j < ​len​(lista2)):
​ f​ (lista1[i] < lista2[j]):
i
result.append(lista1[i])

i += 1
​ lse​:
e
result.append(lista2[j])

j += 1

​# Agregamos los resultados a la lista


result += lista1[i:]
result += lista2[j:]
​ eturn​ result
r

#Impresiones
listafinal = merge_sort(listaNueva)
#print("Lista final Merge:",listafinal)
​ salida.csv",
numpy.savetxt(" ​ listafinal)
#Tiempo
elapsed_time = time() - start_time
​ ​"Elapsed time: %.5f seconds."​ % elapsed_time)
print(

22
PRUEBAS

● Toma de tiempos con particiones 4,5,6,7,8,9,10 para el vector mínimo


de organización

23
Tabla de datos No.19 Tabla de datos No.20 Tabla de datos No.21

Tabla de datos No.22 Tabla de datos No.23 Tabla de datos No.24

24
Tabla de datos No.25

Figura No.7 Gráfica de toma de tiempos entre vector 4-10

El proceso de tomas de datos se hizo con el límite del vector para organizar de 4 a 10 datos
con un vector base de 1.000.000 de datos, se hizo 10 tomas de tiempo para cada No. de
datos del vector mínimo , se compararon los promedios y se llegó a conclusión que el
promedio del vector con 10 datos fue el que menos tiempo dura organizándose con
0.772136 el siguiente promedio menor es el de 8 datos con el promedio 0.774216 con una
diferencia de 0.00208 s siendo el menor el de 10 datos el vector minimo para organizar.

25
● Toma de tiempos con particiones 10,11,13,15,20,25,30,35,40,45,50
minimo de organización

Tabla de datos No.26 Tabla de datos No.27 Tabla de datos No.28

Tabla de datos No.29 Tabla de datos No.30 Tabla de datos No.31

26
Tabla de datos No.32 Tabla de datos No.33 Tabla de datos No.34

Tabla de datos No.35 Tabla de datos No.36

27
Figura No.8 Gráfica de toma de tiempos entre vector 10-50

El proceso de tomas de datos se hizo con el límite del vector para organizar de 10 a 50
datos con un vector base de 1.000.000 de datos, se hizo 10 tomas de tiempo para cada No.
de datos del vector mínimo , se compararon los promedios y se llegó a conclusión que el
promedio del vector con 11 datos fue el que menos tiempo dura organizándose con 0.76536
el siguiente promedio menor es el de 10 datos con el promedio 0.772136 con una diferencia
de 0.006776 s siendo el menor el de 11 datos el vector minimo para organizar.

28
Tabla de datos No.37 Figura No.9 Gráfica de toma de tiempos entre vector 4-50

Tomando en cuenta los promedios que se tomaron en los tiempos,se tomó la decisión que el
código organizara con las particiones de los vectores mínimo en 11 datos volviendo así más
eficiente el código implementado entre burbuja y merge.

CONCLUSIONES
● El método burbuja es más eficiente para una lista de pocos datos.
● La principal desventaja del ordenamiento de burbuja es el hecho de que no se
comporta adecuadamente con una lista que contenga un número grande de
elementos.
● El método burbuja consume bastante tiempo de la computadora para el proceso.
● El método merge sort es un algoritmo estable y es más eficiente manejando
secuencia de acceso lento.
● El número del vector de la partición para ordenar 1.000.000 es de vectores de 11
datos.
● En el caso de Merge sort es que este tiene un inconveniente con respecto a su
rendimiento ya que en el peor de los casos es similar a los rendimientos promedio
del tipo de ordenamiento de burbuja, inserción o por selección.

29
BIBLIOGRAFÍA

[1]https://www.ecured.cu/Ordenamiento_de_burbuja
[2]https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Merge_sort
[3]http://www.fgcasal.org/fgcasal/database/4cgc/4CGC-Comunicaci%C3%B3n-05-Ortuno.
pdf
[4]http://aydalgor.alumnos.exa.unicen.edu.ar/laboratorio

30

También podría gustarte