A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Quicksort Profa. Dra. Ana Paula Appel. História Quicksort é um algoritmo recursivo atribuído a Sir Charles Antony Richard Hoare, C.A.R. Hoare nasceu em.

Apresentações semelhantes


Apresentação em tema: "Quicksort Profa. Dra. Ana Paula Appel. História Quicksort é um algoritmo recursivo atribuído a Sir Charles Antony Richard Hoare, C.A.R. Hoare nasceu em."— Transcrição da apresentação:

1 Quicksort Profa. Dra. Ana Paula Appel

2 História Quicksort é um algoritmo recursivo atribuído a Sir Charles Antony Richard Hoare, C.A.R. Hoare nasceu em Colombo no Ceilão (hoje Sri Lanka), de pais britânicos. Graduou-se na Universidade de Oxford em Estudou tradução computacional de linguagens humanas em visita à Universidade de Moscou, URSS. durante os estudos, foi preciso realizar a ordenação de palavras a serem traduzidas. o quicksort foi o algoritmo desenvolvido por Hoare para ordenar as palavras, em 1960, aos 26 anos. 2

3 Histórico Recebeu o Prêmio Turing da ACM de 1980, por suas contribuições fundamentais para a definição e projeto de linguagens de programação. Em 2009, desculpou-se por ter inventado a referência nula. É atualmente pesquisador sênior da Microsoft Research em Cambridge, England e professor emérito da Universidade de Oxford. There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more dificult. 3

4 Características e estratégia Quicksort é um algoritmo recursivo que utiliza a estratégia da divisão e conquista Não estável. Considerada a mais rápida ordenação baseada em comparações em arranjos. Na prática, se bem implementado, executa quase sempre em Θ(n log n). No pior caso pode executar em tempo Θ(n 2 ). O núcleo do método está na partição realizada em uma lista a ser ordenada. Essa partição rearranja os elementos de uma lista A[p..r] e devolve um índice i em p..r tal que A[p..i-1] < A[i] < A[i+1..r]. O elemento v = A[i] é chamado de pivô. 4

5 Algoritmo 1.Iniciar com uma lista L de n itens 2.Escolher um item pivô v, de L 3.Particionar L em duas listas não ordenadas, L1 e L2 1.L1: conterá todas as chaves menores que v 2.L2: conterá todas as chaves maiores que v 3.Itens com a mesma chave que v podem fazer parte de L1 ou L2 4.O pivô v não faz parte de nenhuma das duas listas 4.Ordenar: 1.L1 recursivamente, obtendo a lista ordenada S1 2.L2 recursivamente, obtendo a lista ordenada S2 5.Concatenar S1, v, S2 – produzindo a lista ordenada S 5

6 Algoritmo O pivô será sempre o primeiro elemento da lista. Na fase de partição, formaremos duas sub-listas, L1 e L2 L1 será ordenada recursivamente. Como foi alcançado o caso base, as listas serão concatenadas L2 será ordenada recursivamente. Como foi alcançado o caso base, as listas serão concatenadas 6

7 Particionamento 7

8 Particionamento O passo principal do algoritmo Quicksort é o particionamento do vetor. o Um número qualquer pode ser escolhido para pivo, geralmente é o elemento inicial; o O vetor é dividido em 3 partes: 8 p Números menores que p Números maiores ou iguais a p p

9 Particionamento To partition a[left...right]: 1. Set pivot = a[left], l = left + 1, r = right; 2. while l < r, do 2.1. while l < right & a[l] < pivot, set l = l while r > left & a[r] >= pivot, set r = r if l < r, swap a[l] and a[r] 3. Set a[left] = a[r], a[r] = pivot 4. Terminate 9

10 Particionamento Escolha um valor para ser usado como pivo, digamos o primeiro Começe da esquerda para o final e encontre o elemento que é maior ou igual ao pivo Faça uma busca de traz para a frente do vetor (direita para o começo) encontre o primeiro elemento que seja menor que o pivo Troque os dois elementos Repita o processo até não ter mais elemento 10

11 Example of partitioning choose pivot: search: swap: search: swap: search: swap: search: (left > right) swap with pivot:

12 Exemplos Embaralhado Ordenado Inverso 12

13 Escolha Pivo É crucial para o bom desempenho do método, já que a fase de partição é a parte crítica do algoritmo.. Há várias estratégias possíveis. Há outras opções como a escolha do elemento correspondente à mediana da lista, ou ainda o mais próximo da média. Para o caso em que se conhece a distribuição dos dados, podemos utilizar a estratégia de escolha do pivô mais adequada àquela distribuição. Quando não há conhecimento... 13

14 Escolha Pivo Escolha aleatória Escolher aleatoriamente um item da lista L como pivô Na média teremos uma partição da lista na proporção: 1/4 e 3/4 É possível provar que, se a partição da lista ocorrer pelo menos metade das vezes nessa proporção, o tempo de execução esperado é O(nlogn). 14

15 Escolha Pivo Mediana de três Escolher três elementos aleatoriamente, Utilizar como pivô o elemento correspondente à mediana dos três. o Essa estratégia aumenta ainda mais as chances de se obter caso esperado de O(n log n). o Como há um maior custo em se obter três elementos aleatórios e obter a mediana, essa estratégia é utilizada apenas em listas grandes. o Quando a lista a ser ordenada tem tamanhos menores, utiliza-se a escolha aleatória simples. 15

16 Código 16

17 Complexidade – Melhor caso Se a escolha do pivô divide o arquivo em partes iguais (~meio) O vetor de tamanho n é dividido ao meio, cada metade é dividida ao meio,..., m vezes => mO(n log 2 n) Cada parte do vetor realiza n comparações (com n = tamanho da partição atual do vetor) Pelo método da árvore de recorrência, tem-se que T(n)= O(nlog 2 n), no melhor caso 17

18 Pior Caso Se vetor já ordenado com escolha do pivô como um dos extremos (elemento 0 ou n-1) Subvetores desiguais, com n chamadas recursivas da função partição, eliminando-se 1 elemento em cada chamada Cada chamada recursiva faz n comparações T(n)= O(n 2 ), no pior caso Igual ao bubble-sort 18

19 Particionamento – Pior Caso 19

20 Caso Médio Caso médio (Sedgewick e Flajelot, 1996) T(n) 1,386n log2 n – 0,846n = O(n log2 n) Um dos algoritmos mais rápidos para uma variedade de situações, sendo provavelmente mais utilizado do que qualquer outro algoritmo 20

21 Dicas Quase qualquer coisa que você tentar para "melhorar" Quicksort pode retardá-lo. Uma boa dica é mudar para um método de classificação diferentes quando um subvetor for pequeno Quicksort tem overhead demais para tamanhos pequenos Para vetores de grandes dimensões, pode ser uma boa ideia para verificar com antecedência se o vetor já está classificado 21

22 Comentários Finais Algoritmo mais rápido conhecido Para eficiência ótima, o pivo deve ser escolhida cuidadosamente A média de três é uma boa técnica para escolher o pivo Contudo não importa o que se faça o Quicksort muitas vezes será O(n 2 ) 22


Carregar ppt "Quicksort Profa. Dra. Ana Paula Appel. História Quicksort é um algoritmo recursivo atribuído a Sir Charles Antony Richard Hoare, C.A.R. Hoare nasceu em."

Apresentações semelhantes


Anúncios Google