Algoritmos de Ordenação: QuickSort

Documentos relacionados
Algoritmos de ordenação Quicksort

Algoritmos de Ordenação: MergeSort

Algoritmos de Ordenação

Complexidade de Algoritmos

Algoritmos de Ordenação: Cota Inferior

Técnicas de projeto de algoritmos: Indução

Tabelas Hash Endereçamento Direto

Estruturas de Dados 2

Quicksort Letícia Rodrigues Bueno

Algoritmos de Ordenação: HeapSort

Algoritmos de Ordenação: Tempo Linear

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

BCC202 - Estrutura de Dados I

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: ClaudioQuick F. M.

Projeto de algoritmos: Algoritmos Gulosos

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

AED2 - Aula 11 Problema da separação e quicksort

Projeto e Análise de Algoritmos

Classes, Herança e Interfaces

Complexidade Assintótica

Análise e Complexidade de Algoritmos

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

QuickSort CI/2015. Análise e Projeto de Algoritmos. - Prof. Lucídio A. F. Cabral

Hashing. ACH Introdução à Ciência da Computação II. Delano M. Beder

Métodos de ordenação. Bubble sort:

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

07 Ordenação em Memória Interna (parte 2) quicksort SCC201/501 - Introdução à Ciência de Computação II

Quicksort. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Análise de Algoritmos Algoritmos de Ordenação

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Estruturas de Dados 2

Análise de Algoritmos

ALGORITMOS DE ORDENAÇÃO

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Estruturas de Dados Algoritmos de Ordenação

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Endereçamento Aberto

Algoritmos de Ordenação

Carlos Eduardo Batista. Centro de Informática - UFPB

Métodos de Ordenação Parte 3

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Algoritmos de Ordenação

1 a Lista de Exercícios

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: Claudio Quick F. M.

Técnicas de projeto de algoritmos: Indução

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Análise de algoritmos

5. Algoritmos de Ordenação

Divisão e Conquista. Fernando Lobo. Algoritmos e Estrutura de Dados II. É uma técnica para resolver problemas (veremos outras técnicas mais adiante).

Complexidade de Algoritmos

Projeto e Análise de Algoritmos

Hashing Endereçamento Direto Tabelas Hash

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Projeto e Análise de Algoritmos

Estruturas Discretas

Bucketsort. CLRS sec 8.4. Algoritmos p. 1

Divisão e conquista. Eficiência de divisão e conquista

Bubble Sort. Tempo total O(n 2 )

Mediana. Aula 09. Menor. i-ésimo menor elemento. Algoritmo de Seleção. -ésimo menor elemento. Mediana é o n+1. -ésimo menor ou o n+1

SCC-501 Introdução à Ciência de Computação II

Divisão e conquista. Há divisão quando o algoritmo tem pelo menos 2 chamadas recursivas no corpo

Ordenação em Tempo Linear. Leitura: Cormen Capítulo 8

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

Solução de Recorrências

Conteúdo. Busca Seqüencial. Busca Binária. Algoritmos de Ordenação e Busca e sua Análise de Complexidade. Alneu de Andrade Lopes Rosane Minghim

AULA 13. Algoritmos p.526/582

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Algoritmos de Ordenação

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Tópico 5 Algoritmos de Ordenação. Parte I - métodos de ordenação: inserção, mergesort, heapsort e quicksort.

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Classificação por Particionamento

Análise e Complexidade de Algoritmos

5COP096 TeoriadaComputação

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Algoritimos e Estruturas de Dados III CIC210

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

MÉTODOS DE CLASSIFICAÇÃO EM MEMÓRIA PRIMÁRIA. George Gomes Cabral

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

O Problema da Ordenação Métodos de Ordenação Parte 1

Classificação e Pesquisa Aula 6 Métodos de Ordenação: ShellSort e QuickSort. Prof. Esp. Pedro Luís Antonelli Anhanguera Educacional

SCC-201 Introdução à Ciência de Computação II

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

SCC Capítulo 3 Análise de Algoritmos - Parte 2

Transcrição:

Algoritmos de Ordenação: QuickSort ACH2002 - Introdução à Ciência da Computação II Delano M. Beder Escola de Artes, Ciências e Humanidades (EACH) Universidade de São Paulo dbeder@usp.br 10/2008 Material baseado em slides do professor Marcos Chaim Delano M. Beder (EACH - USP) QuickSort ACH2002 1 / 21

Projeto por Indução Forte Hipótese de indução forte Sabemos ordenar um conjunto de 1 k < n inteiros. Caso base: n = 1. Um conjunto de um unico elemento está ordenado. Passo da Indução (Segunda Alternativa): Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S. Sejam S 1 e S 2 os subconjuntos de S x dos elementos menores ou iguais a x e maiores que x, respectivamente. Ambos S 1 e S 2 possuem menos do que n elementos. Por hipótese de indução, sabemos ordenar os conjuntos S 1 e S 2. Podemos então obter S ordenado concatenando S 1 ordenado, x e S 2 ordenado (S 1 + x + S 2 ). Delano M. Beder (EACH - USP) QuickSort ACH2002 2 / 21

QuickSort Esta indução dá origem ao algoritmo de divisão e conquista QuickSort. Passos para ordenar um subvetor típico V [p..r] são: Dividir: o vetor V [p..r] é particionado (reorganizado) em dois subvetores (possivelmente vazios) V [p..q 1] e V [q + 1..r] tais que: V [p..q 1] V [q] V [q + 1..r]. O índice q é calculado como parte desse particionamento. Conquistar: os dois subvetores V [p..q 1] e V [q + 1..r] são ordenados por chamadas recursivas ao QuickSort. Combinar: Como os subvetores são ordenados localmente, não é necessário nenhum trabalho para combiná-los: O vetor V [p..r] no final já está ordenado. Delano M. Beder (EACH - USP) QuickSort ACH2002 3 / 21

QuickSort QuickSort void QuickSort(int[] A, int ini, int fim) { if (ini < fim) { int q = particao(a, ini, fim); QuickSort(A, ini, q - 1); QuickSort(A, q + 1, fim); } } No MergeSort a operação de dividir era bem barata. O caro era combinar. No QuickSort, o caro é dividir, enquanto combinar não custa nada. Delano M. Beder (EACH - USP) QuickSort ACH2002 4 / 21

Divisão no QuickSort int particao (int[] A, int ini, int fim) { int i, j, temp; int x = A[fim]; // pivô i = ini; j = fim - 1; while (i <= j) { if(a[i] <= x) { i++; } else if (A[j] > x) { j--; } else { // trocar A[i] e A[j] temp = A[i]; A[i] = A[j]; A[j] = temp; } } A[fim] = A[i]; // reposicionar o pivô A[i] = x; return i; } Delano M. Beder (EACH - USP) QuickSort ACH2002 5 / 21

QuickSort 1. QuickSort (A, 0, 7) 1.1. Partição(A, 0, 7) 1.2. QuickSort (A, 0, 2) 1.2.1 Partição(A, 0, 2) 1.2.2 QuickSort (A, 0, -1) 2 8 7 1 3 5 6 4 i = 0, j = 6 2 8 7 1 3 5 6 4 i = 1, j = 6 2 8 7 1 3 5 6 4 i = 1, j = 5 2 8 7 1 3 5 6 4 i = 1, j = 4 2 3 7 1 8 5 6 4 i = 2, j = 3 2 3 1 7 8 5 6 4 i = 3, j = 2 2 3 1 4 8 5 6 7 pivô = 3 2 3 1 4 8 5 6 7 i = 0, j = 1 2/2 3 1 4 8 5 6 7 i = 0, j = 0 2 3 1 4 8 5 6 7 i = 0, j = -1 1 3 2 4 8 5 6 7 pivô = 0 Delano M. Beder (EACH - USP) QuickSort ACH2002 6 / 21

QuickSort 1.2.3. QuickSort (A, 1, 2) 1.2.3.1. Partição(A, 1, 2) 1.2.3.2. QuickSort (A, 1, 0) 1.2.3.3. QuickSort (A, 2, 2) 1.3. QuickSort (A, 4, 7) 1.3.1 Partição(A, 4, 7) 1 3/3 2 4 8 5 6 7 i = 1, j = 1 1 3 2 4 8 5 6 7 i = 1, j = 0 1 2 3 4 8 5 6 7 pivô = 1 1 2 3 4 8 5 6 7 i = 4, j = 6 1 2 3 4 6 5/5 8 7 i = 5, j = 5 1 2 3 4 6 5 8 7 i = 6, j = 4 1 2 3 4 6 5 7 8 pivô = 6 Delano M. Beder (EACH - USP) QuickSort ACH2002 7 / 21

QuickSort 1.3.2. QuickSort (A, 4, 5) 1.3.2.1. Partição(A, 4, 5) 1.3.2.2. QuickSort (A, 4, 3) 1.3.2.3. QuickSort (A, 5, 5) 1.3.3. QuickSort (A, 7, 7) 1 2 3 4 6/6 5 7 8 i = 4, j = 4 1 2 3 4 6 5 7 8 i = 4, j = 3 1 2 3 4 5 6 7 8 pivô = 4 1 2 3 4 5 6 7 8 ordenado Delano M. Beder (EACH - USP) QuickSort ACH2002 8 / 21

O Desempenho do QuickSort O desempenho do QuickSort depende se o particionamento é balanceado ou não balanceado. Para um dado vetor de tamanho n: 1 Particionamento balanceado mais uniforme possível Dois subproblemas de tamanho n/2 e n/2-1. Note que uma posição foi reservada para o pivô, por isso, a soma do tamanho dos dois problema é n 1. 2 Particionamento desbalanceado, dois subproblemas, um de tamanho n 1 e outro de tamanho 0. Quando isto ocorre? Quando o vetor está ordenado. Particionamento balanceado, divisão em subproblemas entre as partições 1 e 2. Exemplo: n 2 e 1. Delano M. Beder (EACH - USP) QuickSort ACH2002 9 / 21

O Desempenho do QuickSort Se o particionamento é balanceado, o algoritmo é executado assintoticamente tão rápido quanto o MergeSort. Isto é, O(n log n). Vantagem adicional em relação ao MergeSort: é in place, isto é, não utiliza um vetor auxiliar. Note-se que basta ser balanceado, não precisa ser o particionamento mais uniforme! Contudo, se o particionamento não é balanceado, ele pode ser executado tão lentamente quanto os algoritmos InsertionSort, SelectionSort e BubbleSort. Isto é, O(n 2 ). Delano M. Beder (EACH - USP) QuickSort ACH2002 10 / 21

O Desempenho do QuickSort Pior Caso Pior caso do QuickSort ocorre quando a rotina de particionamento produz um subproblema com n 1 elementos e um com zero elementos. O custo da partição é Θ(n). Por quê? Para fazer o particionamento, serão necessárias sempre n comparações, ou seja, Θ(n). Supondo que esse particionamento não balanceado surge em cada chamada recursiva, vamos ter a seguinte a seguinte equação de recorrência. T (n) = T (n 1) + T (0) + n Para T (0) = Θ(1), pois a chamada sobre um vetor de tamanho 0 simplesmente retorna. T (n) = T (n 1) + n Delano M. Beder (EACH - USP) QuickSort ACH2002 11 / 21

Particionamento pior caso Expandindo a equação de recorrência, pode-se concluir que T (n) é Θ(n 2 ) T (n) = T (n 1) + n = T (n 2) + n 1 + n T (n) = T (n 3) + n 2 + n 1 + n... T (n) = T (n k) + nk k 1 i=0 i T (n) = T (n k) + nk k( k 1 2 ) onde n k = 0 n = k Logo, obtemos: T (n) = Θ(1) + n 2 n2 n 2 T (n) = Θ(1) + 2n2 n 2 +n 2 T (n) = Θ(1) + n2 2 + n 2 T (n) = Θ(n 2 ) Delano M. Beder (EACH - USP) QuickSort ACH2002 12 / 21

Particionamento melhor caso Na divisão mais uniforme possível, o particionamento produz dois subproblemas não maiores que n/2: Um tem tamanho n/2 e outro tem tamanho n/2 1. Neste caso QuickSort é executado com muito maior rapidez. A recorrência para o tempo de execução é: T (n) 2T (n/2) + Θ(n) Essa recorrência é semelhante à do MergeSort e sabemos que T (n) = O(n log n) Delano M. Beder (EACH - USP) QuickSort ACH2002 13 / 21

Particionamento balanceado O tempo de execução do caso médio do QuickSort é muito mais próximo do melhor caso do que do pior caso. Para entender isto, considere um particionamento que sempre produza uma divisão proporcional de 9 para 1. Isto parece bastante desequilibrado e possui a seguinte recorrência: T (n) T (9n/10) + T (n/10) + cn Esta recorrência na verdade possui a solução T (n) = O(n log n). (Ver página 122 do Cormen [1]). Delano M. Beder (EACH - USP) QuickSort ACH2002 14 / 21

Intuição para o caso médio Caso médio todas as permutações dos números de entrada são igualmente prováveis. Para um vetor de entrada aleatória é pouco provável que o particionamento ocorra sempre do mesmo modo em todo nível (como suposto na análise informal anterior). Esperado algumas divisões boas e outras ruins, distribuídas aleatoriamente ao longo da árvore. Delano M. Beder (EACH - USP) QuickSort ACH2002 15 / 21

Intuição para o caso médio Suposição: uma divisão ruim (pior caso) seguida de uma boa (melhor caso). Primeira divisão (ruim): T (0) + T (n 1) Segunda divisão (boa): T ( n 1 2 ) + T ( n 1 2 ) Total: T (0) + T ( n 1 2 ) + T ( n 1 2 ) O custo da divisão ruim é absorvido pela divisão boa. Portanto, o tempo de execução do QuickSort quando os níveis se alternam entre divisões boas e ruins é semelhante ao custo para divisões boas sozinhas: T (n) = O(n log n), mas com uma constante maior. Delano M. Beder (EACH - USP) QuickSort ACH2002 16 / 21

Aproximando-se do caso médio Nem sempre as possíveis entradas são equiprováveis. Cheques são registrados na ordem temporal (data) em que são descontados. O banco pode querer uma listagem dos cheques ordenados pelo número do cheque (e.g., 86781, 86782,...). Normalmente, os cheques são emitidos e descontados na ordem do talão, mas nem sempre. Às vezes, o comerciante pode dar um prazo a mais (cheque pré-datado) e demorar para descontar o cheque. Em resumo: a seqüência temporal dos cheques está quase ordenada por número de cheque. Nesta situação, o QuickSort vai ter um desempenho ruim. É então necessário aproximar-se o caso médio. Como? Delano M. Beder (EACH - USP) QuickSort ACH2002 17 / 21

Aproximando-se do caso médio Uma maneira de aproximar-se do caso é escolhendo um pivô aleatoriamente, ao invés de utilizar sempre o último elemento. int particaoaleatoria (int[] A, int ini, int fim) { int i, temp; double f; // Escolhe um número aleatório entre ini e fim f = java.lang.math.random(); // retorna um real f tal que 0 <= f < 1 i = (int) (ini + (fim - ini) * f); // i é tal que ini <= i < fim // Troca de posicao A[i] e A[fim] temp = A[fim]; A[fim] = A[i]; A[i] = temp; return particao(a, ini, fim); } Delano M. Beder (EACH - USP) QuickSort ACH2002 18 / 21

Aproximando-se do caso médio Como é que fica o QuickSort com a partição aleatória? QuickSort Aleatório void quicksortaleatorio(int[] A, int ini, int fim) { if (ini < fim) { int q = particaoaleatoria(a, ini, fim); quicksortaleatorio(a, ini, q - 1); quicksortaleatorio(a, q + 1, fim); } } Delano M. Beder (EACH - USP) QuickSort ACH2002 19 / 21

Resumo QuickSort: Ordenação local (in-place): utiliza quantidade de memória constante além do próprio vetor. Pior caso: Θ(n 2 ). Melhor caso: O(n log n). Caso médio: O(n log n). Delano M. Beder (EACH - USP) QuickSort ACH2002 20 / 21

Referências Referências utilizadas: [1] (páginas 117-124) [1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest & Clifford Stein. Algoritmos - Tradução da 2a. Edição Americana. Editora Campus, 2002. Delano M. Beder (EACH - USP) QuickSort ACH2002 21 / 21