Your SlideShare is downloading. ×
0
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Tema5
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Tema5

174

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
174
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Unidad II Tema 5: Algoritmos de Ordenamiento y Búsqueda Profesor: Jorge Escalona / Tobías Bolívar Email: escaljorge@gmail.com / tobiasbolivar@gmail.com Página Web: http://estructuradatos.tripod.com
  • 2. Algoritmos de Ordenación • Generalmente, se considera ordenar (clasificar) como el proceso de reorganización de un conjunto dado de objetos en una secuencia especificada. • El objetivo de este proceso es facilitar la búsqueda posterior de los elementos del conjunto ordenado. • La búsqueda de información es una operación básica en el proceso de datos, de ahí que por extensión, la ordenación se convierta también en una actividad fundamental en dicho procesamiento de datos. • El tema de la ordenación es idóneo para mostrar como los problemas se pueden resolver utilizando una gran variedad de algoritmos, todos con el mismo objetivo, pero cada uno presentando ciertas ventajas sobre los otros. IntroducciIntroduccióón:n:
  • 3. Algoritmos de Ordenación • Clave: La parte de un registro por la cual se ordena la lista. Por ejemplo, una lista de registros con campos nombre, direccion y telefono se puede ordenar alfabéticamente de acuerdo a la clave nombre. En este caso los campos direccion y telefono no se toman en cuenta en el ordenamiento. • Criterio de ordenamiento (o de comparación): EL criterio que utilizamos para asignar valores a los registros con base en una o más claves. De esta manera decidimos si un registro es mayor o menor que otro, es deir, si se ordena en forma ascendente o descendente. • Registro: Un grupo de datos que forman la lista. Pueden ser datos atómicos (enteros, caracteres, reales, etc.) o grupos de ellos (estructuras, registros u objetos). IntroducciIntroduccióón:n:
  • 4. Algoritmos de Ordenación • Estabilidad: Cómo se comporta con registros que tienen claves iguales. Algunos algoritmos mantienen el orden relativo entre éstos y otros no. Ejemplo: Lista Original : "Pedro 19, Juan 23, Felipe 15, Marcela 20, Juan 18, Marcela 17", Ordenación Estable : "Felipe 15, Marcela 20, Marcela 17, Juan 23, Juan 18, Pedro 19". Ordenación Inestable: "Felipe 15, Marcela 17, Marcela 20, Juan 23, Juan 18, Pedro 19". "Felipe 15, Marcela 20, Marcela 17, Juan 18, Juan 23, Pedro 19". "Felipe 15, Marcela 20, Marcela 17, Juan 23, Juan 18, Pedro 19". • Tiempo de ejecución: Medida de desempeño basada en la complejidad del algoritmo, que no tiene que ver con dificultad, sino con rendimiento. • Requerimientos de memoria: El algoritmo puede necesitar memoria adicional para realizar su labor. En general es preferible que no sea así, pero es común en la programación tener que sacrificar memoria por rendimiento. Criterios para la evaluaciCriterios para la evaluacióón de los algoritmos de ordenacin de los algoritmos de ordenacióón:n:
  • 5. Algoritmos de Ordenación Tabla comparativa de algoritmos Nombre Complejidad Estabilidad Memoria adicional Ordenamiento Burbuja (Bubblesort) O(n2) Estable No Ordenamiento por Selección O(n2) No Estable No Ordenamiento por Inserción O(n2) Estable No Ordenamiento Rápido (Quicksort) O(n * log2(n)) No Estable No Algoritmos de OrdenaciAlgoritmos de Ordenacióón mn máás comunes:s comunes:
  • 6. Algoritmos de Ordenación • Grado de orden de la información: Si la información está parcialmente ordenada y no se requiere mayor grado de complicación, se puede utilizar un algoritmo sencillo como el ordenamiento burbuja. Si por el contrario los datos están muy desordenados, un algoritmo poderoso como Quicksort puede ser el más indicado. Si se desconoce el grado de orden de la información, se recomienda elegir un algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos. • Cantidad de datos a ordenar: Si la cantidad es pequeña, no es necesario utilizar un algoritmo complejo, y es preferible uno de fácil implementación. Una cantidad muy grande puede hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria adicional. • Tipo de datos a ordenar: Algunos algoritmos sólo funcionan con un tipo específico de datos (enteros, enteros positivos, etc.) y otros son generales, es decir, aplicables a cualquier tipo de dato. • Tamaño de los registros de la lista: Algunos algoritmos realizan múltiples intercambios (burbuja, inserción). Si los registros son de gran tamaño estos intercambios son más lentos. Criterios para la selecciCriterios para la seleccióón de un algoritmo de ordenacin de un algoritmo de ordenacióón:n:
  • 7. Algoritmos de Ordenación Algoritmo de OrdenaciAlgoritmo de Ordenacióónn BBúúrbujarbuja /* Ordenación Burbuja para enteros */ #define SWAP(a,b) { int t; t=a; a=b; b=t; } void burbuja( int A[], int n ) /* Pre-condicion: A contiene n elementos a ser ordenados */ { int i, j; for(i=0;i<n;i++) { /* Recorre el arreglo desde el primer elemento hasta el final de la región no ordenada */ for(j=1;j<(n-i);j++) { /* Si elementos adyacentes están fuera de orden, se intercambian */ if( A[j-1]>A[j] ) SWAP(A[j-1],A[j]); } } }
  • 8. Algoritmos de Ordenación AnAnáálisis del Algoritmo de Ordenacilisis del Algoritmo de Ordenacióónn BBúúrbujarbuja Ventajas: •Fácil implementación. •No requiere memoria adicional. Desventajas: •Muy lento. •Realiza numerosas comparaciones. •Realiza numerosos intercambios. Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable. Requerimientos de Memoria: Este algoritmo sólo requiere de una variable adicional para realizar los intercambios. Tiempo de Ejecución: El ciclo interno se ejecuta n veces para una lista de n elementos. El ciclo externo también se ejecuta n veces. Es decir, la complejidad es n * n = O(n2). El comportamiento del caso promedio depende del orden de entrada de los datos, pero es sólo un poco mejor que el del peor caso, y sigue siendo O(n2).
  • 9. Algoritmos de Ordenación Algoritmo de OrdenaciAlgoritmo de Ordenacióón por Seleccin por Seleccióón:n: /* SelectionSort para Enteros */ void seleccion( int A[], int n ) { /* Pre-condicion: A contiene n elementos a ser ordenados */ int x,i,j,k; for( i=1; i <n-1; i++){ x = A[i]; k = i; /* buscar el minimo desde i+1 a n */ for( j =i+1; j <n; j++){ if (A[j] < x){ k = j; /* guarda el indice del minimo */ x = A[j]; /* guarda el valor del minimo */ } } A[k] = A[i]; /* intercambiamos valores */ A[i] = x; } }
  • 10. Algoritmos de Ordenación AnAnáálisis de la Ordenacilisis de la Ordenacióón por Seleccin por Seleccióón:n: Estabilidad: Depende del orden relativo de los datos y del elemento pivot que se seleccione. En general no es estable. Requerimientos de Memoria: Al igual que el ordenamiento burbuja, este algoritmo sólo necesita una variable adicional para realizar los intercambios. Tiempo de Ejecución: El ciclo externo se ejecuta n veces para una lista de n elementos. Cada búsqueda requiere comparar todos los elementos no clasificados. Luego la complejidad es O(n2). Este algoritmo presenta un comportamiento constante independiente del orden de los datos. Luego la complejidad promedio es también O(n2). Ventajas: •Fácil implementación. •No requiere memoria adicional. •Realiza pocos intercambios. •Rendimiento constante: poca diferencia entre el peor y el mejor caso. Desventajas: •Lento. •Realiza numerosas comparaciones.
  • 11. Algoritmo de OrdenaciAlgoritmo de Ordenacióón por Insercin por Insercióón:n: Algoritmos de Ordenación /* InsertionSort para Enteros */ void insercion( int A[], int n ) { /* Pre-condicion: a contiene n elementos a ser ordenados */ int i, j, v; /* Inicialmente, el primer elemento se considera 'ordenado' */ /* i divide el arreglo a en una región ordenada, x<i, y una región no ordenada, x >= i */ for(i=1;i<n;i++) { /* Selecciona el elemento en el inicio de la región no ordenada */ v = A[i]; /* Recorre hacia atrás el arreglo, buscando la posición correspondiente a v */ j = i; /* Si este elemento es mayor que v, moverlo hacia arriba */ while ( A[j-1] > v ) { A[j] = A[j-1]; j = j-1; if ( j <= 0 ) break; } /* Se detiene cuando A[j-1] <= v, colocando a v en la posición j */ A[j] = v; } }
  • 12. Algoritmos de Ordenación AnAnáálisis de la Ordenacilisis de la Ordenacióón por Insercin por Insercióón:n: Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable. Requerimientos de Memoria: Requiere una variable adicional para realizar los intercambios. Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces. El ciclo interno se ejecuta como máximo una vez en la primera iteración, 2 veces en la segunda, 3 veces en la tercera, etc. Esto produce una complejidad O(n2). Ventajas: •Fácil implementación. •Requerimientos mínimos de memoria. Desventajas: •Lento. •Realiza numerosas comparaciones.
  • 13. Algoritmos de Ordenación Nombre Procedimiento: OrdRap Parámetros: lista a ordenar (lista) índice inferior (inf) índice superior (sup) // Inicialización de variables 1. elem_div = lista[sup]; 2. i = inf - 1; 3. j = sup; 4. cont = 1; // Verificamos que no se crucen los //límites 5. if (inf >= sup) 6. retornar; // Clasificamos la sublista 7. while (cont) 8. while (lista[++i] < elem_div); 9. while (lista[--j] > elem_div); 10. if (i < j) 11. temp = lista[i]; 12. lista[i] = lista[j]; 13. lista[j] = temp; 14. else 15. cont = 0; // Copiamos el elemento de división // en su posición final 16. temp = lista[i]; 17. lista[i] = lista[sup]; 18. lista[sup] = temp; // Aplicamos el procedimiento // recursivamente a cada sublista 19. OrdRap (lista, inf, i - 1); 20. OrdRap (lista, i + 1, sup); Algoritmo de OrdenaciAlgoritmo de Ordenacióón Rn Ráápida (pida (QuicksortQuicksort):):
  • 14. Algoritmos de Ordenación AnAnáálisis de la Ordenacilisis de la Ordenacióón Rn Ráápida (pida (QuicksortQuicksort):): Estabilidad: No es estable. Requerimientos de Memoria: No requiere memoria adicional en su forma recursiva. En su forma iterativa la necesita para la pila. Tiempo de Ejecución: • Caso promedio. La complejidad para dividir una lista de n es O(n). Cada sublista genera en promedio dos sublistas más de largo n/2. Por lo tanto la complejidad se define en forma recurrente como: f(1) = 1 ; f(n) = n + 2 f(n/2) ; La forma cerrada de esta expresión es: f(n) = n log2n Complejidad: O(n log2n). • El peor caso ocurre cuando la lista ya está ordenada, porque cada llamada genera sólo una sublista (todos los elementos son menores que el elemento de división). En este caso el rendimiento se degrada a O(n2). Existen diversas optimizaciones que evitan este comportamiento.
  • 15. Algoritmos de Ordenación Ventajas: •Muy rápido •No requiere memoria adicional. Desventajas: •Implementación un poco más complicada. •Recursividad (utiliza muchos recursos). •Mucha diferencia entre el peor y el mejor caso. AnAnáálisis de la Ordenacilisis de la Ordenacióón Rn Ráápida (pida (QuicksortQuicksort):):
  • 16. Algoritmos de Búsqueda • Búsqueda por un índice. – En el caso de arreglos, esto resulta inmediato, basta con acceder a dicho elemento, A[i]. – En el caso de listas enlazadas, se debe recorrer la lista haste el i-ésimo elemento. • Búsqueda por un valor. – Búsqueda Secuencial. (Estructuras sin ningún ordenamiento). Complejidad es O(n) – Búsqueda Binaria. (Estructuras ordenadas por algún valor clave). Complejidad es 0(lg2 n)
  • 17. Algoritmos de Búsqueda Algoritmo Busqueda_Secuencial Entradas A: array [1..n] de T x: T Salida i: 0..n Inicio i <-- 0 repetir i <-- i+1 hasta A[i]=x o i=n si A[i] <> x entonces i <-- 0 (el elemento no está en el vector) devolver(i) Fin
  • 18. Algoritmos de Búsqueda Algoritmo Busqueda_Binaria Entradas A: array [1..n] de T; x: T; Salida k: 0..n Variables i,j: 1..n Inicio i <-- 1; j <-- n repetir k <-- (i+j) div 2 (seleccionamos el elemento central) si x > A[k] entonces i <-- k+1 (buscamos por la derecha) sino j <-- k-1 (buscamos por la izquierda) hasta A[k]=x o i>j si A(k) <> x entonces k <-- 0 devolver(k) Fin

×