You are on page 1of 20

QuickSort

Pesquisa, Ordenação e Técnicas de Armazenamento


Segundo Semestre de 2010
Prof. Fernando Aires
Quick Sort
Mais eficiente algoritmo de ordenação, o
QuickSort trabalha com o conceito de
particionamento.
Ideia geral do particionamento: dado um
elemento, chamado pivô, cria-se um vetor
tal que todos os menores que o pivô estão à
esquerda dele e todos os maiores à direita.
Ideia geral do QuickSort: particione o
vetor, e resolva recursivamente cada um dos
lados.
Particionamento
Pivô
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16

0 1 2 3 4 5 6 7
7 3 8 16 24 42 57 18

Menores Maiores
Particionamento
Algoritmo separado, usado pelo QuickSort.
Percorre o vetor, controlando qual o
primeiro (em posições do vetor) elemento
maior que o pivô (último elemento).
Sempre que encontra um elemento menor
que o pivô, troca ele pelo primeiro maior, e
avança o controle.
No final, troca o pivô pelo primeiro maior.
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 8 18 24 42 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 8 18 24 42 57 16
Particionamento
1o maior
Pivô
0 1 2 3 4 5 6 7
7 3 8 16 24 42 57 18

Onde começa o marcador do primeiro


maior?
O que a função retorna?
Particionamento
public static int part(double[] vetor, int ini, int pivo)
{
int p_maior = ini;
for(int i=ini;i<pivo;i++)
{
if(vetor[i]<vetor[pivo])
{
troca(vetor,i,p_maior);
p_maior++;
}
}
troca(vetor,p_maior,pivo);
return p_maior; //novo pivô
}
Quick Sort

Uma vez com o vetor particionado, como


resolver o problema?
Chama-se recursivamente o QuickSort
para cada um dos lados do
particionamento, ordenando-os.
Caso base: início >= fim.
Quick Sort

public static void quicksort(double[] vetor, int ini, int fim)


{
if(ini<fim)
{
int pivo=part(vetor,ini,fim);
quicksort(vetor,ini,pivo-1);
quicksort(vetor,pivo+1,fim);
}
}
Quick Sort
Algoritmo extremamente eficiente - a
maior parte das implementações de
ordenação usam o Quick Sort.
Não é possível garantir a preservação da
ordem relativa, em caso de “empate”.
Quando o vetor já está ordenado, ele é
lento como o BubbleSort, mas para o
caso médio ele é muito bom.
Exercícios para o lab
Implemente o algoritmo passado em
sala de Quick Sort.
Modifique o algoritmo de forma que ele
ordene os vetores em ordem
decrescente.
Modifique o algoritmo para que ele
receba um vetor de objetos, com
atributos nome e cpf, e ordene por CPF.

You might also like