1 Quicksort Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem. 2004.

Slides:



Advertisements
Presentaciones similares
Unidad 6 Métodos de Ordenamiento Internos
Advertisements

Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
ALGORITMOS DE ORDENAMIENTO
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Diseño y análisis de algoritmos
Paricial IV Ing. Esmeralda Elizabeth Rodríguez Rodríguez
Ordenación rápida (QuickSort)
Bloque 2: Divide y Vencerás
INFORMATICA I Funciones CLASE 13.
Solución de ecuaciones no lineales
UNIVERSIDAD AUTONOMA METROPOLITANA
Analisis y Diseño de Algoritmos Tema: Grafos 3ra Parte
Semana 5 Subprogramas..
Unidad II Aplicaciones con Arreglos en Java y C++
Ordenamiento, Heapsort y Colas de prioridad
Clases 4 Pruebas de Hipótesis
M.C. Yalu Galicia Hdez. (FCC/BUAP)
Análisis de Algoritmos
Single-Source Shortest Paths “Camino más corto desde/hacia una fuente”
Vectors (Vectores) Agustin J. González ELO329. Contenidos Qué es un vector? Declaración de Objetos Vectores Inserción y eliminación de items Uso de sub-índices.
Algoritmos.
Estructuras de Datos Arreglos.
Búsqueda. Búsqueda Secuencial Es el método de búsqueda más sencillo En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y.
Algoritmos de búsqueda
ELO3201 Vectores (Vector) Agustín J. González ELO320.
El lenguaje de programación C - Identificadores y variables – Isidro González Caballero ( Introducción.
2. Diagramas de Estado. ¿Qué es y para qué se usa? Una técnica para desarrollar programas Espacialmente adecuado para programas que tienen que analizar.
Divide y vencerás 1. Método general.
Análisis de algoritmos
Ordenación y Búsqueda.
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Figure: Algoritmos Conceptos básicos. Programación: 1.Establecer una secuencia de acciones que: puedan ser ejecutadas por el procesador realicen una.
EXPRESIONES Y SENTENCIAS
Diseño y análisis de algoritmos Clasificación II.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
COMP 250.  Ejemplo:  Suponer que se necesita codificar un programa donde se muestre como resultado el string “Bienvenidos al mundo de JAVA!!!” cien.
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos 1er. Sem
Árboles de Búsqueda Binaria
Medianas y Estadísticas de Orden
1. Desarrollo de Programas iterativos usando invariante
Agustín J. González ELO320: Estructura de Datos y Algoritmos
ELO3201 Análisis de Algoritmos (Cont.) Agustín J. González ELO320 1º sem 2004.
1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos.
Análisis y Diseño de Algoritmos
1 Ordenamiento en tiempo lineal y Estadísticas de orden Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem 2002.
Algoritmos de Ordenamiento y Complejidad
Quick Sort Estructura de Datos: Métodos de ordenamiento. José Alejandro Leal González Verito no m c tu nombre completo jejeje aquí va!!!
Parte I. Estructuras de Datos.
1 Tablas HASH Agustín J. González ELO320: Estructura de Datos y Algoritmos.
1 Quicksort Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem
1 Single-Source Shortest Paths “Camino más corto desde/hacia una fuente” Agustín J. González ELO320: Estructura de Datos y Algoritmos 1.er. Sem
1 Análisis de algoritmos Generalidades Agustín J. González 1er. Sem
Análisis de Algoritmos
ELO3201 Análisis de Algoritmos (cont.) Agustín J. González ELO320 1º sem 2002.
1 Flujo Máximo Agustín J. González ELO320: Estructura de Datos y Algoritmos.
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
1 Árboles de Búsqueda Binaria Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
Análisis de algoritmos Generalidades
Conceptos Avanzados de Programación
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
Envolvente convexa Parte 1: Algoritmos
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
1 Ordenando. 2 Sorting Input Una secuencia de numeros a 1, a 2, a 3, …, a n Output Una permutación (reorden) a’ 1, a’ 2, a’ 3, …, a’ n de la input, tal.
2. Arreglos e invariantes. Arreglos Un arreglo es una coleccion ordenada de elementos del mismo tipo – Tipos de datos primitivos (int, …) – Referencias.
Curso de Programación Estructurada
Curso de Programación Estructurada
Transcripción de la presentación:

1 Quicksort Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem. 2004

2 Descripción de Quicksort Quicksort, como Mergesort, está basado en el paradigma “dividir y conquistar”. Pasos: Dividir: el arreglo se particiona en dos sub-arreglos no vacíos, tal que cada elemento de un sub-arreglo sea menor o igual a los elementos del otro sub-arreglo. Conquistar: los dos arreglos son ordenados llamando recursivamente a quicksort. Combinar: Como cada arreglo ya está ordenado, no serequiere trabajo adicional. Algoritmo Quicksor(A,p,r){ if (p<r) { q = Partition(A,p,r); Quicksort(A,p,q); Quicksort(A,q+1, r); } }

3 Partition Partition(A,p,r) { x=A[p]; i=p-1; j=r+1; while(1) { do j--; until (A[j]  x) do i++; until (A[i]  x) if (i A[j]; else return j; } } Quicksort(A,p,r){ if (p<r) { q = Partition(A,p,r); Quicksort(A,p,q); Quicksort(A,q+1, r); } }

4 5 | 3 | 2 | 6 | 4 | 1 | 3 | 7 ij ij 3 | 3 | 2 | 6 | 4 | 1 | 5 | 7 ij i j 3 | 3 | 2 | 1 | 4 | 6 | 5 | 7 i j ij Retorna j Explicación Partition efectúa una tarea simple: poner los elementos menores o igual que A[p] en la región inferior del arreglo y los elementos mayores o igual al otro lado.. i parte del extremo inferior del arreglo y j parte del extremo superior. Cada puntero avanza hacia el extremo opuesto buscando elementos que deba mover hacia el otro extremo. j se acerca primero. ¿Cambia si i lo hace primero? Cuando estos elementos son encontrados, son intercambiados. Si estos elementos no son encontrados, i terminará igual o superior a j.

5 Los índices i y j nunca acceden al arreglo fuera de rango. A[p] debe ser el “pivote”. Si se tomara A[r] y ocurre que éste es el mayor valor, Partition retornaría q=r y Quicksort estaría en un loop infinito. Rendimiento de Quicksort: Partition tiene costo  (n). Partición de peor caso: Ocurre cuando el arreglo es particionado en n-1 y 1 elemento cada vez. En este caso se tiene: T(n)=T(n-1) +  (n) = Partición de mejor caso: Ocurre cuando Partition produce dos regiones de igual tamaño. En este caso se tiene: T(n)=2T(n/2)+  (n), de lo cual resulta T(n) =  (n lg n) (caso 2 teorema maestro) Observaciones

6 n nn/109n/10 n n n/100 9n/100 81n/100 1 nn nn 1 El caso promedio también conduce a tiempos  (n lg n). Observaciones Si consideramos que la partición conduce a arreglos desbalanceados en proporción 9 : 1, de todas formas el algoritmo toma tiempo  (n lg n). En este caso T(n) = T(9n/10) +T(n/10) +  (n)

7 Versión “Aleatorizada” de Quicksort Objetivo: Lograr buen desempeño aún cuando la entrada no sea aleatoria. Idea: Tomar aleatoriamente un elemento dentro del arreglo y usarlo como pivote. Randomized_Partition(A,p,r) { i = random(p,r); /* retorna un valor en el rango [p,r] */ exchange A[p] A[i]; return Partition(A, p, r); } Ramdomized_Quicksort(A,p,r) { if (p < r) { q = Randomized_Partition(A,p,r); Randimized_Quicksort(A, p, q); Randomized_Quicksort(A, q+1, r); } }

8 Partition codificado en C para arreglos de enteros int partition(int a[], int l, int r) { int left = l-1, right = r; int pivote = a[r]; for (;;) { while (a[++left] < pivote) ; while ( pivote < a[--right]) if (right == l) break; if (left >= right) break; exch(a,left], right); /*a[left] a[right]*/ } exch(a, left, r); /*a[left] a[r]*/ return left; } Obs: Esta implementación deja el pivote en la posición retornada.

9 Partition codificado en C para arreglos de enteros int partition(int a[], int l, int r); void quicksort(int a[], int l, int r) { int i; if (r <= l) return; i = partition(a, l, r); quicksort(a, l, i-1); quicksort(a, i+1, r); }

10 Comentarios Finales Ojo que quicksort es O(n 2 ) en el peor caso. Quicksort no debería ser usado en sistemas donde haya vidas en juego (sistemas médicos) o misiones críticas (defensa, monitoreo de planta nuclear). En estos casos mejor usar heapsort!. Lo mejor que podemos conseguir en algoritmos de ordenamiento es O(nlgn). Si sabemos algo sobre los datos es posible encontrar soluciones mejores.

11 Divertimento Sólo uno de estos caminos conduce a ciudad de la abundancia. Un duende siempre miente. El otro siempre dice la verdad. Con sólo una pregunta, ¿cómo sé que camino tomar?