230 likes | 388 Views
Estructura de Datos En C++. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes.
E N D
Estructura de Datos En C++ Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48
Objetivo General: Conocerá y manejará las estructuras internas de información Temario: • Conceptos Básicos • La Pila • Colas • Recursión • Listas • Árboles • Ordenamiento • Búsqueda • Administración de Almacenamiento Total a calificar: 110 puntos. 40% Tareas 30% Examen Parcial 30% Examen Final 10% Participación
Material de apoyo: Estructura de Datos con C y C++. YedidyahLangsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College SegundaEdición, Prentice-Hall. Algorithms. ThirdEdition. Parts 1-4, Fundamentals Data StructuresSortingSearching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. ThomsonLearning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html
7. Ordenamiento • Objetivo: El alumno aprenderá los métodos de ordenación interna y externa más importantes actualmente, así como su eficiencia. • Temario: • Antecedentes generales • Ordenación por intercambio directo (Bubble-sort) • Ordenación por inserción directa (Insertion-sort) • Ordenación por el método Shell • Ordenación por el método Quicksort • Ordenación por intercalación (Merge-sort)
Ordenamiento • El proceso de búsqueda se simplifica cuando los datos a considerar se encuentran ordenados • Un archivo de tamaño n es una secuencia de n elementos r[0], r[1], …, r[n-1]. Cada elemento es un registro. A cada registro r[i]se le asocia una llave k[i]. • Se dice que el archivo se encuentra ordenado por llave si i<jimplica que k[i] precede a k[j]. • Ejemplo: El archivo es el directorio telefónico. Cada entrada en el directorio es un registro. La llave para ordenar es el campo de nombre del registro. • El proceso de ordenamiento puede ocurrir sobre los datos mismos, o sobre apuntadores a los datos (ordenamiento por dirección), esto se realiza cuando resulta muy costoso mover los datos mismos por su cantidad. R e g i s t r o s apuntadores apuntadores archivo ordenado ordenados
Ordenamiento: Eficiencia • Consideraciones de eficiencia: • Tiempo para codificar el programa de ordenamiento • Cantidad de tiempo máquina para ejecutar el programa • Cantidad de espacio necesaria para el programa. • Esperaríamos encontrar un ordenamiento óptimo en O(n), sin tomar en cuenta el contenido u orden de ingresos, pero la mayoría de los métodos tienen requisitos de tiempo entre O(n log n) a O(n2).
Ordenamiento de Burbuja: Bubble-sort • Se asume que x es un arreglo de enteros, del cual se van a ordenar n elementos, de modo que x[i] <= x[j], para0<=i<j<n • Idea: • Recorrer el archivosecuencialmentevariasveces • En cadaiteración se compara cada elemento del archivo con su sucesor x[i] con x[i+1] • Se intercambian los elementos (swap) si no están en el orden correcto • Se llama ordenamiento por burbuja porque cada valor lentamente asciende como una burbuja a su posición correcta
EJEMPLO: n = 6 X pass 0 [0] [1] swap [2] [1] [3] [2] swap [4] [3] swap [5] [4] swap
Algoritmo Buble-sort Detectasihubointercambios en unapasada o no. voidbubble(int x[], int n){ inttemp, j, pass; intswitched = TRUE; for(pass = 0; pass<n-1&&switched;pass++){ switched = FALSE; for (j=0; j<n-pass-1; j++) { if(x[j]>x[j+1]){ switched = TRUE; temp = x[j]; x[j] = x[j+1]; x[j+1] = temp; } } } } Los elementosqueya se ordenaron no esnecesariochecarlos Intercambio! Eficiencia: El método en general es O(n2), yaquetiene (n-1) pasadas y (n-1) comparaciones en cadapasada, en total n2-2n+1comparaciones.
OrdenamientoporSelección Directa • Un ordenamiento por selección es aquel en el que se seleccionan elemento sucesivos en orden y se colocan en sus posiciones correctas • Idea: • En un principio el algoritmo toma un arreglo no ordenado • En cada iteración se selecciona el elemento más grande (o el menor) de los elementos restantes del arreglo • El elemento seleccionado se va apilando al principio o al final del arreglo, intercambiando posiciones con el elemento desordenado
EJEMPLO: n = 6 X min I J J J min J I k min J J I min J J min I J
AlgoritmoSelección Directa Asumeque el índice actual como el índice mínimo voidselectionSort(int x[], int n){ int i, j, minindex; for(i=0; i<n-1; i++){ minindex = i; for (j=i+1; j<n; j++) { if(x[j]<x[minindex]){ minindex = j; } } inttemp = x[i]; x[i] = x[minindex]; x[minindex] = temp; } } Actualiza el índice mínimo si encuentras otro valor menor Intercambio!
OrdenamientoporInserción: Insertion-sort • Este método ordena un conjunto de registros insertándolos en un archivo ordenado existente. • Idea: • Inicialmente, se utiliza el primer elemento del arreglo como el componente que se encuentra ordenado • Cuando ya tenemos k elementos ordenados, se toma el elemento k+1, y se compara con los elementos ordenados • Se desplazan todos los elementos de 0 a k que sean mayores a k+1 • Se inserta el elemento k+1 inmediatamente después de algún elemento que no se deba desplazar.
EJEMPLO: n = 6 X Elementos Ordenados k A insertar 10 insertó al principio k No se insertó 20 k 11 11 11 Se inserta entre 10 y 15
Algoritmo Insertion-sort voidinsertionSort(int x[], int n){ int i, k, y; for(k=1; k<n; k++){ y = x[k]; for(i=k-1; i>=0 && y<x[i]; i--){ x[i+1] = x[i]; } x[i+1] = y; } } Los elementos menores de K se asumen ordenados Elemento a insertar Desplazamiento Inserción! Eficiencia: El método en el peor caso es O(n2): (n-1) + (n-2) + 3 + 2 + 1 = (n-1) * n/2.
Ordenamiento de Shell • Método de ordenamiento de incremento decreciente. • Idea: • Mejorar el ordenamiento por inserción considerando elementos separados por varias espacios en el archivo original. Esto lo hace considerando subarchivos. • La idea es utilizar el k-ésimoelemento para producir k subarchivos con k espacios. • Después de ordenar los primeros k subarchivos, se elige un valor más pequeño de k y el archivo se divide en nuevos grupos. • El proceso se repite hasta que k llega a ser 1. Con lo que se ordena todo el subarchivo que viene siendo el archivo completo, utilizando el ordenamiento por inserción. • La idea es incrementar la velocidad del ordenamiento por inserción al subdividir el archivo original en subarchivos, evitando realizar demasiados desplazamientos al mover elementos entre espacios más grandes. • Los valores para k, es decir la secuencia de espacios, en el algoritmo original se determinaba dividiendo el número de elementos N del archivo entre 2, y así sucesivamente hasta alcanzar 1. Existen otras caracterizaciones de la secuencia de espacios que afectan el desempeño general del algoritmo.
EJEMPLO: n = 6 kespacios= {3,1} k j y 11 space =3 j y y k … k … 16 18 y k j 10 space =1 k j 18 k j 15 k j 15
Algoritmo de Shell voidshellSort(int x[], int n, int spaces[], intlengthspaces){ int i, j, k, space, y; for(i=0;i<lengthspaces; i++) { space = spaces[i]; for(j=space; j<n; j++){ y = x[j]; for (k = j-space; k>=0 && y<x[k]; k-=space){ x[k+space] = x[k]; } x[k+space] = y; } } } Elemento para inserción Secuencia de espacios Tamaño del espacio Desplazamiento Inserción! La implementación original del algoritmo requiere O(n2) comparaciones e intercambios en el peor caso.
OrdenamientoQuicksort • Método de ordenamiento basado en la técnica de divide y vencerás. • Idea: • Elegir un elemento de la lista xa ordenar al que se le denomina pivote. • Coloque el elemento pivoteen la posición j de tal manera que prevalezcan las condiciones siguientes: • Cada uno de los elementos en las posiciones 0a j-1es menor que o igual al pivote • Cada uno de los elementos en las posiciones j+1 a n-1es mayor que o igual al pivote • Bajoestascondiciones, el elementox[j]es el j-ésimo elemento más pequeño de la lista • Se repite el proceso anterior con los subarreglos, note que el pivoteya se encuentra en la posición correcta j: • x[0] a x[j-1]y x[j+1] a x[n-1] • Permite en promedio ordenar n elementos en un tiempo proporcional a n log n en el mejor caso (pivote en el centro de la lista), el peor caso es n2 (cuando el pivote se encuentra en un extremo de la lista) • La elección del pivote constituye una de las principales mejoras del algoritmo, se puede elegir a ciegas, el primero o el último, un punto intermedio, por reposición, etc. X pivote
OrdenamientoQuicksort: Selección del Pivote • Por reposicionamiento: Se utilizan dos índices, up y down, se establece como valor del pivote el primer elemento del arreglo por ejemplo. • Los dos apuntadores up y downrecorren la lista simultáneamente con downpor la izquierda y up por la derecha uno hacia el otro de la forma siguiente: • Aumentar el apuntador downen una posición hasta que X[down] > pivote • Decrementar el apuntador up en una posición hasta que X[up] <= pivote • Si up > downy las dos condiciones anteriores se cumplen, se intercambian X[down] con X[up] • El proceso se repite hasta que los apuntadores se cruzan (up<=down), en cuyo punto x[up] se intercambia con x[pivote], y se retorna up como el pivote. n = 6 pivote down up pivote down up pivote down up pivote down up Se rompe el ciclo y se intercambiaup como el nuevopivote. pivote up down pivote Recursivamente se ordenanlassublistas, antes y después del pivote
Algoritmo Quicksort intparticion(int * x, intizq, intder){ intpivote, down, up, temp; down = izq; up = der; pivote= x[izq]; while (down < up){ while(x[down]<=pivote && down<der) down++; while(x[up]>pivote) up--; if(down < up){ temp = x[down]; x[down] = x[up]; x[up] = temp; } } x[izq] = x[up]; x[up] = pivote; return up; } void Quicksort(int * x intlb, intub) { intpivote; if(lb < ub){ pivote=particion(x, lb, ub); Quicksort(x, lb, pivote-1); Quicksort(x, pivote+1, ub); } }
Ordenamientoporintercalación: Merge-sort • Método de ordenamiento basado en técnica de comparaciones. • Idea: • Si el arreglo es de longitud 0 o 1, entonces se encuentra ordenado. De otra manera, • Dividir el arreglo desordenado en dos subarreglos de tamaño proporcional a la mitad • Ordenar cada subarreglo recursivamente reaplicando el método merge-sort • Finalmente, intercalar (merge) los dos subarreglos en un arreglo ordenado • La idea de intercalación asume que es más fácil ordenar una lista pequeña, y que menos pasos se necesitan para construir una lista ordenada de dos listas ordenadas que de dos listas desordenadas.
Merge-sort: Pseudo-código • function merge(left,right) • varlist result • whilelength(left) > 0 or length(right) > 0 • iflength(left) > 0 and length(right) > 0 • iffirst(left) ≤ first(right) • append first(left) to result • left = rest(left) • else • append first(right) to result right = rest(right) • else if length(left) > 0 • append first(left) to result • left = rest(left) • else if length(right) > 0 • append first(right) to result • right = rest(right) • end while • returnresult functionmerge_sort(m) iflength(m) ≤ 1 return m varlist left, right, result varinteger middle = length(m) / 2 for each x in m up to middle add x to left for each x in m after or equal middle add x to right left = merge_sort(left) right = merge_sort(right) result = merge(left, right) returnresult