21
Quicksort Quicksort Profa. Dra. Ana Paula Appel

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

Embed Size (px)

Citation preview

Page 1: 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

QuicksortQuicksortProfa. Dra. Ana Paula Appel

Page 2: 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

HistóriaHistó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 1956.• 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

Page 3: 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

HistóricoHistó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

Page 4: 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

Características e Características e estratégiaestraté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 Θ(n2).

• 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

Page 5: 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

AlgoritmoAlgoritmo1. Iniciar com uma lista L de n itens 2. Escolher um item pivô v, de L3. Particionar L em duas listas não ordenadas, L1 e

L2 1. L1: conterá todas as chaves menores que v2. L2: conterá todas as chaves maiores que v 3. Itens com a mesma chave que v podem fazer parte de L1 ou L24. 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

Page 6: 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

AlgoritmoAlgoritmo• 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

Page 7: 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

ParticionamentoParticionamento

7

Page 8: 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

ParticionamentoParticionamento• 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

Page 9: 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

ParticionamentoParticionamento• 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 + 12.2. while r > left & a[r] >= pivot , set r = r - 12.3. if l < r, swap a[l] and a[r]

3. Set a[left] = a[r], a[r] = pivot 4. Terminate

9

Page 10: 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

ParticionamentoParticionamento• 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

Page 11: 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

ExemplosExemplos• Embaralhado• Ordenado• Inverso

12

Page 12: 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

Escolha PivoEscolha 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

Page 13: 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

Escolha PivoEscolha 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

Page 14: 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

Escolha PivoEscolha 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

Page 15: 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

CódigoCódigo

16

Page 16: 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

Complexidade – Complexidade – Melhor casoMelhor 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 => m≈O(n log2n)

• 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(nlog2n), no melhor caso

17

Page 17: 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

Pior CasoPior 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(n2), no pior caso• Igual ao bubble-sort

18

Page 18: 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

Particionamento – Pior CasoParticionamento – Pior Caso

19

Page 19: 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

Caso MédioCaso 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

Page 20: 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

DicasDicas• 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

Page 21: 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

Comentários FinaisComentá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(n2)

22