Você está na página 1de 29

Algoritmos

de Ordenao: Quick Sort


Centro de Inform-ca Universidade Federal de Pernambuco Sistemas de Informao Vinicius Cardoso Garcia vcg@cin.ufpe.br

2011 Vinicius Cardoso Garcia

Quick Sort
A idia do quicksort tem como base dois princpios, assim como o mergesort:
Recurso Abordagem dividir para conquistar

1. Dividir o problema em sub-problemas (menores) 2. Resolver estas novas instncias (recursivamente) 3. Juntar as solues parciais para achar a soluo do problema principal.

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Quick Sort
O Quiksort um algoritmo de ordenamento que no pior caso (n2)
Contudo, na pr-ca, geralmente a melhor opo!
Devido a sua alta ecincia no caso mdio: (nlgn)

O algoritmo Quicksort u-liza a t-ca de dividir e conquistar


Esta t-ca dividida em trs partes para a realizao do ordenamento do arranjo A[p..r]
Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Dividir para Conquistar


Dividir:
A[p..r] par-cionado em dois subarranjos, A[p..q-1] e A[q +1..r]
Cada elemento de A[p..q-1] menor ou igual que A[q]. A[q] menor ou igual a todos os elementos de A[q+1..r] O ndice q calculado como parte do procedimento de par-cionamento

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Dividir para Conquistar


Conquistar:
Os dois subarranjos A[p..q-1] e A[q+1..r] so ordenados por chamadas recursivas ao quiksort

Combinar:
Os arranjos so ordenados localmente! No h trabalho para combin-lo: O arranjo A [p..r] est inteiramente ordenado!

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Quick Sort
Em cada iterao escolha uma posio do subarranjo (piv): ap A idia bsica organizar os elementos do subarranjo de forma que:
Todos os elementos a esquerda de ak so menores ou iguais a ap Todos os elementos a direita de ak so maiores que ap Onde k a posio correta do piv

Repe-r o processo para o subarranjo a esquerda de k, e para o subarranjo a direita de k

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Quicksort Pseudo-Cdigo

Para ordenar um arranjo A, chamado inicialmente a funo QUICKSORT(A, 1, comprimento[A])


Em python, seria de 0 at comprimento[A]-1
Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

COMO FUNCIONA O PARTICIONAMENTO ???


Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

v3 v3
lef

v1 v1
lef

v5 v5
lef

v2 v2

v7 v7

v8 v8

v6 v6

v4 v4
1. Escolhe o piv 2.1 Anda com lef

v3

v1

v5

v2
right

v7

v8

v6
right

v4
2.2 Anda com right

right right

v3

v1

v2
right

v5
lef

v7

v8

v6

v4

2.3 swap(lef,right) e repete 2.1

v3

v1

v2

v5

v7

v8

v6

v4

2.3 Sai do loop e swap(piv,lef)

right right

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

Con2nua

ParYcionamento
v3 v1 v5 v2 v7 v8 v6 v4

v3

v1

v2

v4

v7

v8

v6

v5

Agora que o piv est na posio correta devemos chamar recursivamente o sort para o arranjo da esquerda e em seguida para o arranjo da direita
Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

10

v3 v3

v1 v1

v2 v2

v4 v4 . . .

v7 v7

v8 v8

v6 v6

v5 v5

3 Ordena subarray a esquerda (recurs.)

v1 v1

v2 v2

v3 v3

v4 v4 . . .

v7 v7

v8 v8

v6 v6

v5 v5

4 Ordena subarray a direita (recurs.)

v1

v2

v3

v4

v5

v6

v7

v8

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

11

90 100 20 90 100 20 50 100 20 50 50 50 30 30 30 20 20 20

60 60 60 60 60 60

80 110 120 40 80 110 120 40 80 110 120 40 80 110 120 40 10 110 120 40 10

10 10 10

30 30 30

50 50 90

70 70 70 70 70 70

10 100 90 80 100 90

40 120 110 80 100 90

lef >= right ento troca(lef,pivo) 50 30 20 60 10 40 70 110 80 100 90 120


Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

12

50 50 10

30 30 30

20 20 20

60 60 60

10 10 50

40 40 40

70 110 80 100 90 120 70 110 80 100 90 120 70 110 80 100 90 120

lef >= right ento troca(lef,pivo) 10 10 10 30 30 30 20 20 20 40 40 40 50 50 50 60 60 60 70 110 80 100 90 120 70 110 80 100 90 120 70 110 80 100 90 120

lef >= right ento troca(lef,pivo) 10 20 30 40 50 60 70 110 80 100 90 120 Algoritmos e Estrutura de Dados
Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

13

10 10 10 10

20 20 20 20

30 30 30 30

40 40 40 40

50 50 50 50

60 60 60 60

70 110 80 100 90 120 70 110 80 100 90 120 70 110 80 100 90 120 70 110 80 100 90 120

lef >= right ento troca(lef,pivo) 10 10 20 20 30 30 40 40 50 50 60 60 70 110 80 100 90 120 70 110 80 100 90 120 Algoritmos e Estrutura de Dados
Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

14

10 10

20 20

30 30

40 40

50 50

60 60

70 110 80 100 90 120 70 110 80 100 90 120

lef >= right ento troca(lef,pivo) 10 10 10 20 20 20 30 30 30 40 40 40 50 50 50 60 60 60 70 110 80 100 90 120 70 110 80 100 90 120 70 80 110 100 90 120

lef >= right ento troca(lef,pivo) 10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 90 100 110 120

Algoritmos e Estrutura de Dados 80 90 100 110 120 Ordenao 2011 Vinicius Cardoso Garcia

15

10 10

20 20

30 30

40 40

50 50

60 60

70 70

80 80

90 100 110 120 90 100 110 120

lef >= right ento troca(lef,pivo) 10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 80 90 100 110 120 90 100 110 120

Ordenado!
Algoritmos e Estrutura de Dados Ordenao 2011 Vinicius Cardoso Garcia

16

ParYcionamento do Arranjo
O Procedimento PARTITION organiza o subarranjo A [p..r] localmente
int par-ciona(int[] a, int lef, int right, int pivo) { int posPivo = right--; while(true) { while (a[lef]<pivo) lef++; while (right>=0 && a[right]>pivo) right--; if (lef>=right) break; else swap(a, lef, right); } swap(a, lef, posPivo); return lef; }
Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

17

Analisando o Pseudo-Cdigo
Loop invariante:
possvel enunciar um loop invariante entre as linhas 3 e 6 do pseudo-cdigo Propriedades:
Se p k i, ento A[k] x Se I + 1 k j - 1, ento A[k] > x Se k = r, ento A[k] = x

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

18

Analisando o Pseudo-Cdigo
Inicializao:
Antes da primeira iterao
i=p-1 j=p

No h nenhum nmero entre p e i, e entre i+1 e j-1


As duas primeiras propriedades so saYsfeitas

A atribuio na linha 1
A terceira propriedade saYsfeita!

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

19

Analisando o Pseudo-Cdigo
Manuteno
Existem dois casos a considerar, dependendo do teste da linha 4:
Se A[j]>x
A nica ao do loop incrementar j (as propriedades conYnuam vlidas)

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

20

Analisando o Pseudo-Cdigo
Manuteno
Existem dois casos a considerar, dependendo do teste da linha 4:
Se A[j] x
A[i] e A[j] so permutados e ento j incrementado Assim, ca: A[i] x (propriedade 1 saYsfeita) A[j-1] > x (propriedade 2 saYsfeita)

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

21

Analisando o Pseudo-Cdigo
Trmino:
j=r
Toda a entrada no arranjo pose ser classicada em um dos trs conjuntos denidos pelo loop invariante
Um conjunto com todos os elementos menores que x Um conjunto com todos os elementos maiores que x Um conjunto unitrio contende x

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

22

Desempenho do Quiksort
" "

Desempenho do Quiksort

O par-cionamento tem custo (n) ! O particionamento tem custo (n) Par-cionamento no pior caso ! Particionamento no pior caso

So produzidos d subproblemas: um um n-1 So produzidos dois ois subproblemas: com com n-1 elementos e com zero elementos. elementos e umum com zero elementos. Gera-se a recurso: Gera-se a recurso:

O que signica T(n) (n 2(n2) ! O que significa T(n) = = )

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

23

Desempenho do Quiksort
n/2
!

Desempenho do Quiksort
Par-cionamento do melhor caso:
Sendo um n/2 e o outro n/2 - 1

Particionamento do melhor scaso: So produzidos dois ubproblemas no maiores " So produzidos dois subproblemas no maiores que que n/2
"

Gera-se a recorrncia: Gera-se a recorrncia:

Sendo um !n/2" e o outro #n/2$ - 1

O que significa T(n) = O(nlgn)

O que signica T(n) = O(nlgn)

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

24

Desempenho do Quiksort

Desempenho do alanceado Caso mdio Quiksort Par-cionamento b


!

No caso mdio, o algoritmo quicksort se Particionamento balanceado Caso mdioaproxima muito mais o algoritmo quicksort ue do pior c " No caso mdio, do melhor caso do qse aproxima aso! muito mais doqmelhor ar-cionamente pior caso! roduza Suponha ue o p caso do que do sempre p " Suponhadiviso proporcional dsempre produza uma uma que o particionamente e 9 para 1:
diviso proporcional de 9 para 1:

O que significa T(n) = O(nlgn)

O que signica T(n) = O(nlgn)


Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

25

Desempenho do Quiksort

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

26

Verso Aleatria do Quicksort


O caso mdio signica um par-cionamento mdio
Assim se garan-rmos que o parcionamento mdio esteja balanceado, tambm garan-mos que na mdio o custo do quicksort ser O(nlgn) Para tal aleatoriza-se a escolha no piv

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

27

QuickSort
O quicksort mais eciente do que o mergesort na maior parte dos casos. No entanto, para uma seqncia inversamente ordenada o quicksort demora muito mais que o mergesort. Esse o pior caso, portanto, a complexidade do quicksort O(n2)! O quicksort popular pois uma seqncia inversamente ordenada di|cil de ocorrer. Portanto, na maioria das vezes seria melhor usar o quicksort.
Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

28

AYvidades complementares
Implemente o Quicksort em Python
Ambas as verses (normal e aleatria)

Leitura do captulo 7 do Cormen Resolva o problema do livro do Cormen


7-1 (pg. 129 da verso em portugus)

Algoritmos e Estrutura de Dados Algoritmo de Ordenao: Quick Sort 2011 Vinicius Cardoso Garcia

29

Você também pode gostar