You are on page 1of 29

Quicksort

Algoritmo de Ordenao Rpida

Tecnologia em Anlise e Desenvolvimento de Sistemas


Estrutura de Dados
Prof. Fernanda Pupo Larguesa

Douglas Santos
Evertt Arima
Jssica Teixeira
Pedro Gonalez
Pedro Henrique

Disciplina
& Equipe

Algoritmo de Ordenao QuickSort

Introduo
Funcionamento
Cenrios
o
o

Contedo

Melhor
Pior

Algoritmo
Aplicabilidade
Detalhes de Implementao
Melhorias
Fontes

Algoritmo de Ordenao QuickSort

Introduo

Proposto por Charles Antony


Richard Hoare em 1960 e publicado
em 1962;
o algoritmo de ordenao interna
mais rpido que se conhece para
uma ampla variedade de situaes;
Provavelmente o mais utilizado;
Algoritmo de Ordenao QuickSort

Introduo

Quicksort popular porque no difcil de


implementar, funciona bem para uma variedade
de tipos diferentes de entrada de dados, e
substancialmente mais rpido que qualquer
outro mtodo de ordenao em aplicaes
tpicas. in-place (usa somente uma pequena
pilha auxiliar), necessita tempo proporcional a N
log N em mdia para ordenar N itens, e tem um
loop interno extremamente pequeno.

Algoritmo de Ordenao QuickSort

Introduo

Dividir o problema de ordenar um conjunto


com N itens em dois problemas menores;
Os problemas menores so ordenados
independentemente;
As parties so combinadas para produzir
a soluo final;
O algoritmo considerado instvel, pois h
a possibilidade de elementos com mesma
chave mudar de posio no processo de
ordenao
Algoritmo de Ordenao QuickSort

A parte mais delicada do mtodo o


processo de partio.
O vetor A [Esq...Dir] rearranjado por meio da
escolha arbitrria de um piv x.
O vetor A particionado em duas partes:
Funcionamento

Parte esquerda: chaves x.


Parte direita: chaves x.

Algoritmo de Ordenao QuickSort

Algoritmo para o particionamento:

Funcionamento

1. Escolha arbitrariamente um piv x.


2. Percorra o vetor a partir da esquerda
at que A[i] x.
3. Percorra o vetor a partir da direita at
que A[j] x.
4. Troque A[i] com A[j].
5. Continue este processo at os
apontadores i e j se cruzarem.
Algoritmo de Ordenao QuickSort

Ao final, do algoritmo de partio:


o vetor A[Esq..Dir] est particionado de tal
forma que:
Os itens em A[Esq], (A[Esq + 1], ..., A[j]), so
menores ou iguais a x;
Os itens em A[i], (A[i + 1], ..., A[Dir]), so maiores
ou iguais a x.

Funcionamento

Algoritmo de Ordenao QuickSort

Algoritmo:

Algoritmo

Se:
O nmero de elementos a ordenar for zero ou um
ento termine (no h o que ordenar);
Seno:
Escolha um elemento do conjunto para ser o
piv;
Organize os elementos de acordo com o piv
os elementos menores ficam a esquerda do piv;
os elementos maiores ficam a direita do piv;

Chame recursivamente o algoritmo para ordenar o


grupo de elementos a direita e a esquerda do piv.
Algoritmo de Ordenao QuickSort

Algoritmo

(Algorithms Sedgewick and Wayne 4. Ed. Pg. 289)


Algoritmo de Ordenao QuickSort

Anlise
Melhor caso:
CN = 2 CN/2 + N = N log N
Esta situao ocorre quando cada
partio divide o arquivo em duas partes
iguais.

Cenrios

Algoritmo de Ordenao QuickSort

Melhor caso:

Cenrios

Uma rvore de recurso para QUICKSORT em que o PARTICIONAMENTO sempre equilibra os dois lados
igualmente (melhor caso). O tempo de execuo resultante O(n lg n).

Algoritmo de Ordenao QuickSort

Anlise
Caso mdio de acordo com Sedgewick
e Flajolet (19 96, p. 17):
CN 1,386 log N 2 ln N
Isso significa que em mdia o tempo de
execuo do Quicksort O(n log n).

Cenrios

Algoritmo de Ordenao QuickSort

Caso mdio:

Cenrios

Uma rvore de recurso para QUICKSORT em que o PARTICIONAMENTO sempre produz uma diviso de 9-para1, tendendo a um tempo de execuo de O(n lg n). FONTE:

Algoritmo de Ordenao QuickSort

Anlise
Pior caso:
CN = N2
O pior caso ocorre quando,
sistematicamente, o piv escolhido
como sendo um dos extremos de um
arquivo j ordenado.
Isto faz com que o procedimento de
ordenao seja chamado recursivamente
N vezes, eliminando apenas um item em
cada chamada.

Cenrios

Algoritmo de Ordenao QuickSort

Pior caso:

Cenrios
Uma rvore de recursividade para QUICKSORT em que o procedimento de PARTIO sempre coloca
apenas um elemento de um lado da partio (pior caso). O tempo de execuo resultante O(n 2).

Algoritmo de Ordenao QuickSort

Vantagens:

Melhor opo para ordenar vetores grandes;


Muito rpido por que o lao interno simples;
Memria auxiliar para a pilha de recurso pequena;
Complexidade no caso mdio O(n lg(n)).

Desvantagens:
Aplicaes

Perde eficincia em vetores pequenos;


No estvel (no conhecida forma eficiente para
tornar o quicksort estvel);
Pior caso quadrtico.

Algoritmo de Ordenao QuickSort

Detalhes de Implementao:
Particionamento interno (Partitioning inplace).
Se usarmos um vetor extra, particionamento fcil de implementar, mas
no to mais fcil que vale o custo de a verso particionada de volta no
original.

Permanea dentro dos limites (Staying in bounds).


Detalhes de
Implementao

Se o menor ou maior valor do vetor for o piv, temos que tomar cuidado
para os indicadores no ultrapassarem os limites esquerdo ou direito do
vetor, respectivamente.

Algoritmo de Ordenao QuickSort

Detalhes de Implementao:
Preservar a aleatoriedade (Preserving randomness).
O embaralhamento aleatrio desordena o vetor. Desde que trate todos os
termos nos sub-vetores uniformemente, este recurso tem a propriedade
de que estes tambm estejam aleatoriamente desordenados. Este fato
crucial para a previsibilidade do algoritmo. Uma forma alternativa para
preservar a aleatoriedade escolher um termo aleatrio para piv na
partio.

Finalizando o loop (Terminating the loop).


Detalhes de
Implementao

Teste apropriadamente se os indicadores cruzaram um pouco mais


difcil do que pode parecer primeira vista. Um erro comum esquecer
de considerar que o vetor possa ter termos de mesmo valor que o piv.

Algoritmo de Ordenao QuickSort

Detalhes de Implementao:
Manipulando termos com valores iguais ao piv (Handling items with
keys equal to the partitioning item's key).
melhor para as varreduras esquerda para valores maiores ou iguais ao
piv e direita para valores menores ou iguais ao piv. Apesar desta
poltica possa parecer criar trocas desnecessrias envolvendo termos de
mesmo valor, crucial para evitar tempo de execuo quadrtico em
certas aplicaes tpicas.

Finalizando a recurso (Terminating the recursion).


Detalhes de
Implementao

Um erro comum na implementao do quicksort envolve no se


assegurar que determinado termo seja sempre colocado em posio,
gerando um loop recursivo infinito quando o piv o menor ou maior
valor no vetor.

Algoritmo de Ordenao QuickSort

Melhorias:

Melhorias

Mudar para Insertion Sort.


Como na maioria dos algoritmos recursivos, uma forma fcil de
melhorar a performance do quicksort baseada nas seguintes
duas observaes:
Quicksort mais devagar que insertion sort para pequenos
sub-vetores.
Se for recursivo, quicksort certamente chamar a si mesmo
para pequenos sub-vetores.
O melhor valor para mudar para Insertion Sort dependente do
Sistema, mas qualquer valor entre 5 e 15 provvel de ser
eficiente para maioria das situaes.

Algoritmo de Ordenao QuickSort

Melhorias:

Melhorias

Particionamento Mediana-de-trs.
Uma segunda forma fcil de melhorar performance do quicksort
usar a medianda de uma amostra pequena de termos retirada
do sub-vetor como sendo o piv. Tal ao resultar em uma
partio melhor, mas ao custo de computar a mediana. Na
prtica, a maior parte das melhorias vm da escolha de uma
amostra de tamanho 3 e particionando no item central. Como um
bonus, pocemos usar a amostra como sentinelas nas
extremidades do vetor e remover ambos dos testes de partio.

Algoritmo de Ordenao QuickSort

Melhorias:

Melhorias

Entropy-optimal sorting.
Vetores com grandes quantidades de valores duplicados
aparecem com frequncia em aplicaes. Por exemplo, podemos
querer ordenar um grande arquivo de colaboradores por ano de
nascimento, ou talvez separ-los por gnero. Nestas situaes,
implementar o quicksort tem uma performance considervel,
mas pode ser melhorado de forma substancial. Por exemplo, um
sub-vetor que consiste apenas de termos de mesmo valor no
precisa ser processado novamente, mas nossa implementao
continua a particion-los em sub-vetores menores. Em uma
sitao onde h um grande nmero de valores duplicados, a
natureza recursiva do quicksort se assegura que sub-vetores
compostos inteiramente de termos de mesmo valor ocorrer com
frequncia. H potencial para uma melhora significativa.
Algoritmo de Ordenao QuickSort

Sedgewick, Robert & Wayne, Kevin


Algorithms - 4th. Edition
Princeton University Pearson Education, Inc.
Chapter 2.3 page 288

Cormen, Leiserson, Rivest & Stein


Introduction to Algorithms 3rd. Edition
The MIT Press Massachusetts Institute of Technology
Chapter 7 page 170

Sedgewick, Robert
Algorithms
Brown University Addison-Wesley Publishing Co.
Chapter 9 page 103

Princeton University Dept. of Computer Science

Fontes

Hanson, David R.
Lecture 11 Quicksort
https://www.cs.princeton.edu/courses/archive/spr97/cs126

University of North Carolina Dept. of Computer Science


http://cs.unc.edu

Jordan University of Science and Technology


Chapter 7 Quicksort
www.just.edu.jo/~basel/algorithms/.../algo_ch7_quick_sort.pdf
Algoritmo de Ordenao QuickSort

University of Science and Technology of China


http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap08.htm

Souza, Jairo Francisco de


Universidade Federal de Juiz de Fora - UFJF
Estrutura de Dados II Quicksort
http://www.ufjf.br/jairo_souza/ensino/material/ed2

Boniati, Bruno B.
Universidade Federal de Santa Maria
Estrutura de dados Quicksort & Mergesort
http://www.cafw.ufsm.br/~bruno

Menotti, David

Fontes

Universidade Federal de Ouro Preto - UFOP


Estrutura de Dados I Quicksort
http://www.decom.ufop.br/menotti/

Feofiloff, Paulo
http://www.ime.usp.br/~pf/algoritmos/
http://www.ime.usp.br/~pf/analise_de_algoritmos/

Algoritmo de Ordenao QuickSort

Apndice

Algoritmo de Ordenao QuickSort

Cdigo Quicksort Bsico:


// Esta funo rearranja qualquer vetor
// v[p..r] em ordem crescente.

Apndice

void quicksort (int v[], int


{
int j;
// 1
if (p < r) { //ou while(p < r) {
j = separa (v, p, r);
quicksort (v, p, j-1);
quicksort (v, j+1, r);
}
}

Algoritmo de Ordenao QuickSort

p, int r)
// 2
// 3
// 4
// 5

Algoritmo de Separao:
// Recebe vetor v[p..r] com p <= r. Rearranja
// os elementos do vetor e devolve j em p..r
// tal que v[p..j-1] <= v[j] < v[j+1..r].

Apndice

static int
separa (int v[], int p, int r) {
int c = v[p], i = p+1, j = r, t;
while (i <= j) {
if (v[i] <= c) ++i;
else if (c < v[j]) --j;
else {
t = v[i], v[i] = v[j], v[j] = t; ++i; --j;
}
}
// agora i == j+1
v[p] = v[j], v[j] = c;
return j;
}
Algoritmo de Ordenao QuickSort