Katia S. Guimarães katia@cin.ufpe.br QUICKSORT Katia S. Guimarães katia@cin.ufpe.br.

Slides:



Advertisements
Apresentações semelhantes
Algoritmos em Grafos (Parte 2)
Advertisements

HASHING Katia Guimarães julho/2002
ALINHAMENTOS LOCAIS E SEMI-GLOBAIS
Grafos Introdução
Solved Exercises 1. Finding the Peak. Let A= a1,…,an be a sequence of n numbers with the following property: there is p in {1,…,n} for which (i) the.
TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS ESTRUTURAS DE DADOS AVANÇADAS Aula /08/2011 Professor Leomir J. Borba-
Algoritmos de Ordenação
Profa. Dra. Ana Paula Appel
Análise Projeto de Algoritmos
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
Pesquisa em Memória Primária
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Estruturas de Dados I DECOM – UFOP
HeapSort Filas de Prioridade – Heap
Pesquisa em Memória Primária
David Menotti Estruturas de Dados I DECOM – UFOP
Qualiti Courses :: Documento de Requisitos. {icc2, jmmn, mmc2, CIn-UFPE Equipe Ivan Cordeiro Cardim Julio Maravitch Maurício.
FACENS – Engenharia da Computação Lógica Computacional II
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Classificação de dados por Troca: QuickSort
Classificação de dados por Intercalação: MergeSort
O uso de questionários em trabalhos científicos
Dividir-e-Conquistar
Complexidade de Computação Para avaliar a qualidade de um algoritmo usamos como critério o espaço e o tempo de execução. Ao.
Introdução à NP-completude
Backtracking Katia Guimarães.
5COP096 Teoria da Computação
Marco Antonio Montebello Júnior
Algoritmos de Ordenação
Programa de Cargos e Salários
Neoliberalismo e Crise da Educação Pública
Silogística Tudo o que os artistas fazem é arte.
Algoritmos de ordenação
Intr. à Biologia Computacional
Intr. à Biologia Computacional
Intr. à Biologia Computacional ALINHAMENTO DE SEQÜÊNCIAS.
Pesquisa em Memória Primária
Comparação entre os métodos de ordenação
Desempenho, Método de Shell, Quicksort
Complexidade de algoritmos e Classificação (Ordenação) de dados
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
FABER Cirurgia & Implantes.
LÓGICA FILOSÓFICA. Teoria Obj: Construir um conceito de lógica
ALINHAMENTOS LOCAIS E SEMI-GLOBAIS
Introdução à NP-completude Katia S. Guimarães
Algoritmos Gulosos em Grafos
Katia S. Guimarães Busca em Grafos Katia S. Guimarães
Abordagens para problemas NP-completos
Árvores Binárias e Encaminhamentos
Katia S. Guimarães Heaps Katia S. Guimarães
Remoção e Inserção em Heaps
Katia S. Guimarães Heapsort Katia S. Guimarães
Mergesort Katia Guimarães.
Ferramentas de Planejamento
Ceça Moraes – Introdução à Programação SI1
QuickSort Dividir: A[p…r] é particionado (reorganizado) em dois subvetores não vazios A[p…q] e A[q+1…r] tal que cada elemento de A[p…q] é menor ou igual.
Outubro  Apresentar através de debates o perfil e papel dos Multiplicadores e Área de O & M / Processos.  Implantar.
MANUAIS NA EMPRESA
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Métodos de Ordenação.
Geometria Computacional Fecho Convexo
ATAL – Prof. Jorge Figueiredo Ordenação AT AL Análise e Técnicas de Algoritmos Análise de Algoritmos de Ordenação.
Classificação Ordenação de Dados
Classificação (Ordenação) de dados
Ordenação (Sorting) Ordenar é dispor os elementos de um conjunto numa ordem ascendente ou descendente. Problema: Dados n números, arranjá-los em ordem.
Algoritmos com matrizes e vetores
Métodos de Pesquisa e Ordenação
Métodos de Pesquisa e Ordenação
Transcrição da apresentação:

Katia S. Guimarães katia@cin.ufpe.br QUICKSORT Katia S. Guimarães katia@cin.ufpe.br

Uma outra abordagem Dividir-para-conquistar? Vimos que o Mergesort usava a abordagem dividir-para-conquistar, porém fazia a divisão de forma trivial, levando a muito trabalho na fase de conquistar. Será que poderíamos encontrar um esquema onde a divisão fosse feita com mais cuidado, de forma a tornar a conquista mais rápida? janeiro/2003 katia@cin.ufpe.br

Uma outra abordagem Dividir-para-conquistar Vamos procurar dividir o array em duas partes, de forma que: - Os elementos y, menores que um certo elemento x fiquem todos à esquerda de x, e - Os elementos z, maiores do que x fiquem todos à direita de x. y  x x x < z janeiro/2003 katia@cin.ufpe.br

Uma outra abordagem Dividir-para-conquistar Ficam duas questões: 1- Será que isso agiliza a etapa do conquistar? 2- Quanto custa fazer uma divisão tão sofisticada? Se dividirmos o array de acordo com esta regra, na fase de conquistar (após o retorno das chamadas recursivas) o arquivo estará ordenado! janeiro/2003 katia@cin.ufpe.br

Quanto Custa Dividir? Como fazer uma divisão tão sofisticada? Vamos começar definindo quem será o “pivô” x. Se nenhuma distribuição dos elementos é conhecida, então um elemento é tão bom como outro qualquer no array. Tomaremos pivô  x[1] janeiro/2003 katia@cin.ufpe.br

Quanto Custa Dividir? Em seguida, vamos começar a inspecionar o array pela esquerda, prosseguindo enquanto o elemento y sendo inspecionado for  x: i  left; enquanto array[i]  x faça i  i + 1 right left x y  x z i     janeiro/2003 katia@cin.ufpe.br

Onde devemos colocar o elemento z? Como z > x, ele deve ser colocado numa posição mais à direita do array. Mas onde? Talvez na última posição do array? right left x y  x z  z? i      janeiro/2003 katia@cin.ufpe.br

Onde devemos colocar o elemento z? Observe que na última posição do array pode haver um outro elemento t com t > x. Se colocarmos z ali, estaremos fazendo trabalho inútil, pois t já está no lugar correto. Então onde colocaremos z? janeiro/2003 katia@cin.ufpe.br

Onde será um bom lugar para z? Vamos começar a inspecionar o array pela direita, prosseguindo enquanto o elemento t sendo inspecionado for > x: j  right; enquanto array[j] > x faça j  j - 1 right left x y  x z t  x  y i    j janeiro/2003 katia@cin.ufpe.br

Situação conveniente Temos z = array[i] > x e t = array[j]  x Se os trocarmos, teremos reduzido a nossa tarefa a um array bem menor que o original. right left x y  x z t j x  y i x y  x t z x  y x y  x x  y janeiro/2003 katia@cin.ufpe.br

Custo de Particionar? Como varremos o array comparando cada elemento com o pivô (eventualmente trocando os elementos de posição), o custo é  (n). right left x y  x z t j x  y i x y  x t z x  y x y  x x  y janeiro/2003 katia@cin.ufpe.br

Algoritmo Particiona Algoritmo Particiona (A, left, right) i  left; j  right; pivô  A[left]; while i < j do { while A[i]  pivô do i  i + 1; while A[j] > pivô do j  j - 1; if i < j then switch (A[i], A[j]) } switch (A[left], A[j]) retorne (j) janeiro/2003 katia@cin.ufpe.br

Algoritmo Quicksort Algoritmo Quicksort (A, left, right) if left < right then { split  Particiona (A, left , right) Quicksort (A, left, split -1) Quicksort (A, split + 1, right) } retorne ( ) janeiro/2003 katia@cin.ufpe.br

Considerações de Implementação Quando a quantidade de elementos é pequena, é melhor usar um outro algoritmo na chamada recursiva. Na verdade, quando n é pequeno, quanto mais simples melhor janeiro/2003 katia@cin.ufpe.br

Considerações de Implementação Como a escolha do pivô é crucial para um bom desempenho do algoritmo, as implementações usam métodos mais sofisticados para a sua escolha, sendo os mais populares: 1. Mediana ( A[left], A[(right+left) / 2], A[right] ) 2. Aleatório (left..right) janeiro/2003 katia@cin.ufpe.br

Custo de QuickSort - Caso Desfavorável Se a posição do pivô no array ordenado está sempre ou muito próximo do início ou muito próximo do final, então o tempo de execução de Quicksort é alto. Por exemplo, se o array de entrada está ordenado, o pivô é sempre o menor elemento da seqüência então     A primeira partição gasta (n-1) comparações e deixa n-1 chaves por serem ordenadas.  Q(n) = (n–1) + (n–2) + (n–3) + ... + 1 = n (n –1) / 2 = (n2) janeiro/2003 katia@cin.ufpe.br

Custo de QuickSort - Caso Favorável Designaremos por Q(n) o número de comparações de chaves que Quicksort faz para uma entrada de tamanho n. Se o pivô sempre particionasse as chaves em partes iguais, então o número de comparações seria aproximadamente: (1 * n) + (2 * n/2) + (4 * n/4) + (8 * n/8) + ... + (n * 1) E a relação de recorrência seria:   Q(n) = 2 * Q(n/2) + O(n) , Q(1) = 1 Neste caso, já sabemos (Mergesort) que Q(n) = (n log n). janeiro/2003 katia@cin.ufpe.br