Algoritmos  de   Ordenação:  Quick  Sort  

Centro  de  Informá-ca   Universidade  Federal  de  Pernambuco   Sistemas  de  Informação     Vinicius  Cardoso  Garcia   vcg@cin.ufpe.br  

©  2011  –  Vinicius  Cardoso  Garcia  

Quick  Sort  
•  A  idéia  do  quicksort  tem  como  base  dois  princípios,   assim  como  o  mergesort:  
–  Recursão   –  Abordagem  dividir  para  conquistar  

1. Dividir o problema em sub-problemas (menores) 2. Resolver estas novas instâncias (recursivamente) 3. Juntar as soluções parciais para achar a solução do problema principal.

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

2  

Quick  Sort  
•  O  Quiksort  é  um  algoritmo  de  ordenamento   que  no  pior  caso  é  Θ(n2)  
–  Contudo,  na  prá-ca,  geralmente  é  a  melhor   opção!  
•  Devido  a  sua  alta  eficiência  no  caso  médio:  Θ(nlgn)  

•  O  algoritmo  Quicksort  u-liza  a  tá-ca  de   dividir  e  conquistar  
–  Esta  tá-ca  é  dividida  em  três  partes  para  a   realização  do  ordenamento  do  arranjo  A[p..r]  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

3  

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  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

4  

Dividir  para  Conquistar  
•  Conquistar:    
–  Os  dois  subarranjos  A[p..q-­‐1]  e  A[q+1..r]  são   ordenados  por  chamadas  recursivas  ao  quiksort    

•  Combinar:  
–  Os  arranjos  são  ordenados  localmente!   –  Não  há  trabalho  para  combiná-­‐lo:  O  arranjo  A [p..r]  está  inteiramente  ordenado!  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

5  

Quick  Sort  
•  Em  cada  iteração  escolha  uma  posição  do  subarranjo   (pivô):  ap   •  A  idéia  básica  é  organizar  os  elementos  do   subarranjo  de  forma  que:  
–  Todos  os  elementos  a  esquerda  de  ak  são  menores  ou   iguais  a  ap   –  Todos  os  elementos  a  direita  de  ak  são  maiores  que  ap   –  Onde  k  é  a  posição  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  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

6  

Quicksort  –  Pseudo-­‐Código  

•  Para  ordenar  um  arranjo  A,  é  chamado  inicialmente  a  função   QUICKSORT(A,  1,  comprimento[A])  
–  Em  python,  seria  de  0  até  comprimento[A]-­‐1  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

7  

COMO  FUNCIONA  O   PARTICIONAMENTO  ???  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

8  

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  Ordenação:  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  posição  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  Ordenação:  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  Ordenação:  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  então  troca(lef,pivo)   50   30   20   60   10   40   70   110   80   100   90   120  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  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  então  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  então  troca(lef,pivo)   10   20   30   40   50   60   70   110   80   100   90   120   Algoritmos  e  Estrutura  de  Dados  
Algoritmo  de  Ordenação:  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  então  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  Ordenação:  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  então  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  então  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   Ordenação   ©  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  então  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   Ordenação   ©  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  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

17  

Analisando  o  Pseudo-­‐Código  
•  Loop  invariante:    
–  É  possível  enunciar  um  loop  invariante  entre  as   linhas  3  e  6  do  pseudo-­‐código   –  Propriedades:    
•  Se  p  ≤  k  ≤  i,  então  A[k]  ≤  x     •  Se  I  +  1  ≤  k  ≤  j  -­‐  1,  então  A[k]  >  x     •  Se  k  =  r,  então  A[k]  =  x  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

18  

Analisando  o  Pseudo-­‐Código  
•  Inicialização:  
–  Antes  da  primeira  iteração    
•  i=p-­‐1   •  j=p    

–  Não  há  nenhum  número  entre  p  e  i,  e  entre  i+1  e   j-­‐1  
•  As  duas  primeiras  propriedades  são  saYsfeitas    

–  A  atribuição  na  linha  1  
•  A  terceira  propriedade  é  saYsfeita!  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

19  

Analisando  o  Pseudo-­‐Código  
•  Manutenção  
–  Existem  dois  casos  a  considerar,  dependendo  do   teste  da  linha  4:  
•  Se  A[j]>x  
–  A  única  ação  do  loop  é  incrementar  j  (as  propriedades   conYnuam  válidas)  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

20  

Analisando  o  Pseudo-­‐Código  
•  Manutenção  
–  Existem  dois  casos  a  considerar,  dependendo  do   teste  da  linha  4:  
•  Se  A[j]  ≤  x  
–  A[i]  e  A[j]  são  permutados  e  então  j  é  incrementado   –  Assim,  fica:  A[i]  ≤  x  (propriedade  1  saYsfeita)   –  A[j-­‐1]  >  x  (propriedade  2  saYsfeita)  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

21  

Analisando  o  Pseudo-­‐Código  
•  Término:  
–  j=r  
•  Toda  a  entrada  no  arranjo  pose  ser  classificada  em  um   dos  três  conjuntos  definidos  pelo  loop  invariante  
–  Um  conjunto  com  todos  os  elementos  menores  que  x     –  Um  conjunto  com  todos  os  elementos  maiores  que  x     –  Um  conjunto  unitário  contende  x  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  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

–  São  produzidos  d subproblemas: um um   n-1 São produzidos dois ois  subproblemas:  com com  n-­‐1   elementos  e   com zero elementos. elementos e umum  com  zero  elementos.   Gera-se a recursão: –  Gera-­‐se  a  recursão:  

–  O  que  significa  T(n)  (n  2Θ(n2)   ! O que significa T(n) = Θ = )

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  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: –  São  produzidos  dois   ubproblemas  não  maiores   " São produzidos dois subproblemas não maiores que que  n/2  
"

–  Gera-­‐se  a  recorrência:   Gera-se a recorrência:

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

!

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

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

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

24  

Desempenho  do  Quiksort  

Desempenho do alanceado  –  Caso  médio   Quiksort •  Par-cionamento  b
!

–  No  caso  médio,  o  algoritmo  quicksort  se   Particionamento balanceado – Caso médioaproxima   muito  mais  o algoritmo quicksort ue  do  pior  c " No caso médio, 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 " Suponhadivisão  proporcional  dsempre produza uma uma   que o particionamente e  9  para  1:  
divisão proporcional de 9 para 1:

!

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

•  O  que  significa  T(n)  =  O(nlgn)  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

25  

Desempenho  do  Quiksort  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

26  

Versão  Aleatória  do  Quicksort  
•  O  caso  médio  significa  um  par-cionamento   médio  
–  Assim  se  garan-rmos  que  o  parcionamento  médio   esteja  balanceado,  também  garan-mos  que  na   médio  o  custo  do  quicksort  será  O(nlgn)   –  Para  tal  aleatoriza-­‐se  a  escolha  no  pivô  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

27  

QuickSort  
•  O  quicksort  é  mais  eficiente  do  que  o   mergesort  na  maior  parte  dos  casos.   •  No  entanto,  para  uma  seqüência   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  seqüência   inversamente  ordenada  é  di|cil  de  ocorrer.   Portanto,  na  maioria  das  vezes  seria  melhor   usar  o  quicksort.  
Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

28  

AYvidades  complementares  
•  Implemente  o  Quicksort  em  Python  
–  Ambas  as  versões  (normal  e  aleatória)  

•  Leitura  do  capítulo  7  do  Cormen   •  Resolva  o  problema  do  livro  do  Cormen  
–  7-­‐1  (pág.  129  da  versão  em  português)  

Algoritmos  e  Estrutura  de  Dados   Algoritmo  de  Ordenação:  Quick  Sort   ©  2011  –  Vinicius  Cardoso  Garcia  

29