Introducción a la Computación Algoritmos de Ordenamiento II Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 23/04/2013 E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 1 / 15 Introducción Outline 1 Introducción 2 Bubble Sort El programa 3 Merge Sort 4 Tarea E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 2 / 15 Introducción Ordenamiento de una secuencia Tenemos una secuencia de elementos de un tipo T . Queremos modificar la secuencia tal que: sus elementos queden en orden creciente vamos a hacerlo permutando elementos Ejemplo Si al comienzo tuviéramos la secuencia a == [2, 1, 2, 1], debo terminar con a0 == [1, 1, 2, 2]. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 3 / 15 Introducción Describiendo qué hace Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las ambigüedades que tiene el lenguaje natural. Usamos ≤ para denotar una relación de orden entre elementos de T . Debo decir qué va a hacer mi algoritmo: problema sort(a : [T]){ E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 4 / 15 Introducción Describiendo qué hace Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las ambigüedades que tiene el lenguaje natural. Usamos ≤ para denotar una relación de orden entre elementos de T . Debo decir qué va a hacer mi algoritmo: problema sort(a : [T]){ devuelvo una secuencia a0 que cumpla: mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1 } Con a0 denotamos el valor que contiene la variable a a la salida. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 4 / 15 Introducción Describiendo qué hace Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las ambigüedades que tiene el lenguaje natural. Usamos ≤ para denotar una relación de orden entre elementos de T . Debo decir qué va a hacer mi algoritmo: problema sort(a : [T]){ devuelvo una secuencia a0 que cumpla: mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1 } Con a0 denotamos el valor que contiene la variable a a la salida. mismosElementos(a, b : [T]) : Bool =len(a) ==len(b) and (∀x ∈ a) cuenta(x, a) == cuenta(x, b) E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 4 / 15 Introducción Describiendo qué hace Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las ambigüedades que tiene el lenguaje natural. Usamos ≤ para denotar una relación de orden entre elementos de T . Debo decir qué va a hacer mi algoritmo: problema sort(a : [T]){ devuelvo una secuencia a0 que cumpla: mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1 } Con a0 denotamos el valor que contiene la variable a a la salida. mismosElementos(a, b : [T]) : Bool =len(a) ==len(b) and (∀x ∈ a) cuenta(x, a) == cuenta(x, b) cuenta(x : T, a : [T]) : Int =len( [y | y ∈ a, y == x] ) | {z } todas las apariciones de x que es una manera de contar la cantidad de apariciones del elemento x en la secuencia a. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 4 / 15 Bubble Sort Outline 1 Introducción 2 Bubble Sort El programa 3 Merge Sort 4 Tarea E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 5 / 15 Bubble Sort El algoritmo de burbujeo (Bubble Sort) La operación básica es el intercambio o swap entre elementos adyacentes. El procedimiento consiste en realizar una serie de pasadas sobre los datos a ordenar. Las pasadas comienzan en uno de los extremos de la secuencia y avanzan hacia el otro. Se revisa cada par de elementos y se los invierte si están desordenados entre ellos. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 6 / 15 Bubble Sort Ejemplo de Bubble Sort Vamos a ordenar la secuencia a: 50 30 40 80 70 10 90 60 len(a) = 8 E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 7 / 15 Bubble Sort El programa El programa Esto es una propuesta de un programa que implementa el algoritmo de bubble sort, a que no saben las cosas que no me gustan de esta propuesta?: def b u b b l e S o r t ( a ) : f o r i i n range ( 0 , l e n ( a ) ) : f o r j i n range ( 0 , l e n ( a ) − 1): i f a [ j ] > a [ j +1]: swap ( a , j , j +1) return a E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 8 / 15 Bubble Sort El programa El programa Esto es una propuesta de un programa que implementa el algoritmo de bubble sort, a que no saben las cosas que no me gustan de esta propuesta?: def b u b b l e S o r t ( a ) : f o r i i n range ( 0 , l e n ( a ) ) : f o r j i n range ( 0 , l e n ( a ) − 1): i f a [ j ] > a [ j +1]: swap ( a , j , j +1) return a problema swap(a : [Int], x, y : Int){ requiere 0 ≤ x ≤ len(a) − 1 and 0 ≤ y ≤ len(a) − 1 modifica a asegura a0 [x] == a[y] and a0 [y] == a[x] } E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 8 / 15 Bubble Sort El programa El programa Esto es una propuesta de un programa que implementa el algoritmo de bubble sort, a que no saben las cosas que no me gustan de esta propuesta?: def b u b b l e S o r t ( a ) : f o r i i n range ( 0 , l e n ( a ) ) : f o r j i n range ( 0 , l e n ( a ) − 1): i f a [ j ] > a [ j +1]: swap ( a , j , j +1) return a problema swap(a : [Int], x, y : Int){ requiere 0 ≤ x ≤ len(a) − 1 and 0 ≤ y ≤ len(a) − 1 modifica a asegura a0 [x] == a[y] and a0 [y] == a[x] } Los elementos más grandes se van moviendo o burbujeando hacia el extremo de la secuencia. Si no hay intercambios realizados después de una iteración completa es que la secuencia está ordenada y el proceso termina. La especificación del ciclo es muy parecida al upsort, pero no es igual... ¡van a tener que adaptarla! E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 8 / 15 Bubble Sort El programa Complejidad de Bubble Sort el ciclo externo de Bubble Sort itera n veces E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 9 / 15 Bubble Sort El programa Complejidad de Bubble Sort el ciclo externo de Bubble Sort itera n veces en cada iteración se hace una pasada llevando un elemento hacia el extremo (una burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez? E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 9 / 15 Bubble Sort El programa Complejidad de Bubble Sort el ciclo externo de Bubble Sort itera n veces en cada iteración se hace una pasada llevando un elemento hacia el extremo (una burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez? el total de pasos es O(n + (n − 1) + . . . + 2) = O(n ∗ (n + 1)/2 − 1) = O(n2 ) E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 9 / 15 Bubble Sort El programa Complejidad de Bubble Sort el ciclo externo de Bubble Sort itera n veces en cada iteración se hace una pasada llevando un elemento hacia el extremo (una burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez? el total de pasos es O(n + (n − 1) + . . . + 2) = O(n ∗ (n + 1)/2 − 1) = O(n2 ) Ya vimos que los mejores algoritmos de ordenamiento son O(n log n) E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 9 / 15 Merge Sort Outline 1 Introducción 2 Bubble Sort El programa 3 Merge Sort 4 Tarea E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 10 / 15 Merge Sort Merge Sort Se basa en la idea de que se pueden secuencias ordenadas se pueden unir (o hacerles un merge) en tiempo lineal. Se van separando los arreglos hasta llegar a pedazos de longitud 2, que se pueden ordenar fácilmente. Luego se van ordenando los pedazos cada vez más grandes. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 11 / 15 Merge Sort Recursión El mecanismo de recursión surge naturalmente en muchos casos. Los dos casos más conocidos son: 1 La función factorial: factorial(n)=n*factorial(n-1) 2 La sucesión de Fibonnacci: Fibonnacci(n) = Fibonnacci(n-1)*Fibonnacci(n-2) E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 12 / 15 Merge Sort Recursión El mecanismo de recursión surge naturalmente en muchos casos. Los dos casos más conocidos son: Sı́, faltan los casos bases, sino esto nunca termina: 1 La función factorial: factorial(n)=n*factorial(n-1), factorial(0)=1 2 La sucesión de Fibonnacci: Fibonnacci(n) = Fibonnacci(n-1)*Fibonnacci(n-2), Fibonnacci(0) = 1, Fibonnacci(1) = 1. Este mecanismo suele ser muy elegante para implementar algoritmos, pero en los lenguajes imperativos, es costoso desde el punto de vista computacional y no es lo natural para hacer (recordar que el mecanismo habitual es la iteración). Sin embargo, el algoritmo de merge sort, es uno de esos casos en el que la implementación por medio de la recursión va muy bien. En Python, una función recursiva es simplemente aquella que se llama a sı́ misma, ni más ni menos. E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 12 / 15 Merge Sort Merge Sort, implementación La idea del algorirtmo mergeSort para ordenar una secuencia a es: Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada). E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 13 / 15 Merge Sort Merge Sort, implementación La idea del algorirtmo mergeSort para ordenar una secuencia a es: Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada). Sea a1 la subsecuencia con los primeros n/2 elementos de a Sea a2 la subsecuencia con los últimos n/2 elementos de a E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 13 / 15 Merge Sort Merge Sort, implementación La idea del algorirtmo mergeSort para ordenar una secuencia a es: Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada). Sea a1 la subsecuencia con los primeros n/2 elementos de a Sea a2 la subsecuencia con los últimos n/2 elementos de a Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 . Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 . E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 13 / 15 Merge Sort Merge Sort, implementación La idea del algorirtmo mergeSort para ordenar una secuencia a es: Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada). Sea a1 la subsecuencia con los primeros n/2 elementos de a Sea a2 la subsecuencia con los últimos n/2 elementos de a Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 . Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 . Devolver el resultado de unir (merge) a01 y a02 . E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 13 / 15 Merge Sort Merge Sort, implementación La idea del algorirtmo mergeSort para ordenar una secuencia a es: Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada). Sea a1 la subsecuencia con los primeros n/2 elementos de a Sea a2 la subsecuencia con los últimos n/2 elementos de a Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 . Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 . Devolver el resultado de unir (merge) a01 y a02 . E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 13 / 15 Tarea Outline 1 Introducción 2 Bubble Sort El programa 3 Merge Sort 4 Tarea E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 14 / 15 Tarea Ejercicios Hoy también venimos tranqui: 1 Deben modificar la implementación dada en clase del algoritmo de burbujeo para que termine en cuanto se detecte que la secuencia está ordenada. Se debe proponer un invariante y mostrar un esquema que muestre que la propuesta tiene sentido en el funcionamiento del algoritmo, también se debe mencionar cuál serı́a la función variante. 2 Se debe implementar el algoritmo de merge sort. En este no les vamos a insistir con los invariantes, bastante ya tienen con la recursión! E. Mocskos (UBA–CONICET) Clase 7: Algoritmos de Ordenamiento II 23/04/2013 15 / 15