Algoritmos y Estructura de Datos I Taller de Sorting Facultad de Ciencias Exactas y Naturales Lunes 27 de octubre de 2014 Algoritmos y Estructura de Datos I Menú del dı́a • Presentación de algunos algoritmos de ordenamiento Algoritmos y Estructura de Datos I Menú del dı́a • Presentación de algunos algoritmos de ordenamiento • Programar Algoritmos y Estructura de Datos I Menú del dı́a • Presentación de algunos algoritmos de ordenamiento • Programar • Programar Algoritmos y Estructura de Datos I Menú del dı́a • Presentación de algunos algoritmos de ordenamiento • Programar • Programar • Programar Algoritmos y Estructura de Datos I Menú del dı́a • Presentación de algunos algoritmos de ordenamiento • Programar • Programar • Programar • Pensar invariantes Algoritmos y Estructura de Datos I ¿Por qué ordenar? Algoritmos y Estructura de Datos I ¿Por qué ordenar? Ejemplos de problemas: • Búsqueda (Searching) • Unicidad de elementos • Par más cercano • Selección (máximo, mı́nimo, k -ésimo) Mucho más... Algoritmos y Estructuras de Datos II Algoritmos y Estructura de Datos I Bogosort Primer algoritmo de sorting También conocido como: • Slowsort • Monkey Sort ¿?¿??? • Shotgun Sort • Random Sort Algoritmos y Estructura de Datos I Bogosort Primer algoritmo de sorting También conocido como: • Slowsort • Monkey Sort ¿?¿??? • Shotgun Sort • Random Sort RandomSort( aList ): while not inOrder( aList ): shuffle( aList ) Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 7 4 9 5 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 7 4 9 5 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 7 4 9 5 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 4 7 9 5 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 4 7 9 5 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 3 4 5 7 9 2 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 2 3 4 5 7 9 6 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 2 3 4 5 6 7 9 1 Algoritmos y Estructura de Datos I Insertion Sort • Inserta en el lugar correcto y mueve al resto. • Similar a lo que una persona harı́a si quiere ordenar (por ejemplo un mazo de cartas). • Idea: Dada una lista xs, leo un elemento por vez. Para cada elemento de xs que leo, busco la posición donde debe estar entre los elementos leı́dos, y lo inserto en ese lugar. • Ejemplo: 1 2 3 4 5 6 7 9 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 3 7 4 9 5 2 6 1 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 7 4 9 5 2 6 3 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 4 9 5 7 6 3 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 3 9 5 7 6 4 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 3 4 5 7 6 9 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 3 4 5 7 6 9 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 3 4 5 6 7 9 Algoritmos y Estructura de Datos I Selection Sort • Idea: Dada una lista xs, la pienso en dos partes: lo que ya ordené, y lo que está pendiente. En cada paso, busco el mı́nimo (máximo) de los elementos pendientes, y lo ubico al final de la parte ya ordenada. • Ejemplo: 1 2 3 4 5 6 7 9 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 5 3 1 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 5 3 1 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 5 1 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 5 1 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 1 5 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 1 5 4 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 1 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 3 1 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I Bubble Sort • Procesa varias veces cada elemento. • Basado fuertemente en Swap. • Idea: Dada una lista xs, toma de a pares de elementos adyacentes en cada iteración y los compara. De acuerdo al resultado los deja como está o intercambia sus posiciones. Termina cuando no hay más intercambios que hacer. • Ejemplo: 1 3 4 5 Algoritmos y Estructura de Datos I ¡A trabajar! • Primero pasemos al enunciado... Algoritmos y Estructura de Datos I Selection Sort void selectionSort(vector<int>& xs){ int i= 0, n= xs.size(); while ( i < n ){ int imin= indexOfMinFrom(i,xs); swap(xs[i],xs[imin]); i= i+1; } } int indexOfMinFrom(int pos, vector<int>& xs){ int i= pos, n= xs.size(); while ( i < n ){ if(xs[i] < xs[pos]) pos= i; i= i+1; } return pos; } Algoritmos y Estructura de Datos I Selection Sort void selectionSort(vector<int>& xs){ int i= 0, n= xs.size(); while ( i < n ){ int imin= indexOfMinFrom(i,xs); swap(xs[i],xs[imin]); i= i+1; } } int indexOfMinFrom(int pos, vector<int>& xs){ int i= pos, n= xs.size(); while ( i < n ){ if(xs[i] < xs[pos]) pos= i; i= i+1; } return pos; } n−1 n i=0 i=1 Costo: ∑ n − i = ∑ i = n(n−1) 2 ∈ O(n2 ) Algoritmos y Estructura de Datos I Insertion Sort void insertionSort(vector<int>& xs){ int i= 0; int n= xs.size(); while(i<n){ int j= i; while (j>0 && xs[j-1] > xs[j]){ int aux= xs[j-1]; xs[j-1]= xs[j]; xs[j]= aux; j--; } i++; } } Algoritmos y Estructura de Datos I Insertion Sort void insertionSort(vector<int>& xs){ int i= 0; int n= xs.size(); while(i<n){ int j= i; while (j>0 && xs[j-1] > xs[j]){ int aux= xs[j-1]; xs[j-1]= xs[j]; xs[j]= aux; j--; } i++; } } Complejidad: O(n2 ) • ¿Y si la lista está parcialmente ordenada? ¿Y si está al revés? • Estabilidad Algoritmos y Estructura de Datos I Bubble Sort void bubbleSort(vector<int>& xs){ int i= 0, n= xs.size(); while(i < n){ int j= 0; while(j < n-1){ if(xs[j] > xs[j+1]) swap(xs[j],xs[j+1]); j=j+1; } i=i+1; } } Complejidad: O(n2 ) Algoritmos y Estructura de Datos I Otros algoritmos: • • • • • Quicksort Merge Sort (in-place) Heapsort Introsort (STL) Binary Tree Sort • Counting Sort • Radix Sort • Bucket Sort Algoritmos y Estructura de Datos I Otros algoritmos: • • • • • Quicksort Merge Sort (in-place) Heapsort Introsort (STL) Binary Tree Sort • Counting Sort • Radix Sort • Bucket Sort ¿Y si no entra en memoria? Algoritmos y Estructura de Datos I • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. 2009. Introduction to Algorithms, Third Edition (3rd ed.). The MIT Press. • Donald E. Knuth. 1998. The Art of Computer Programming, Volume 3: (2nd Ed.) Sorting and Searching. Addison Wesley Longman Publishing Co., Inc., Redwood City, CA, USA. • http://www.sorting-algorithms.com • http://sorting.at • http://gkoberger.github.io/stacksort/ • http://www.youtube.com/user/AlgoRythmics Algoritmos y Estructura de Datos I Algoritmos y Estructura de Datos I Algoritmos y Estructura de Datos I Figure : http://gkoberger.github.io/stacksort Algoritmos y Estructura de Datos I Figure : http://www.youtube.com/user/AlgoRythmics Algoritmos y Estructura de Datos I