Professional Documents
Culture Documents
BCC202 Aula 16
Algoritmos e Estruturas de Dados I
QuickSort
Proposto por 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.
QuickSort
A idia bsica dividir o problema de ordenar um
conjunto com n itens em dois sub-problemas menores.
Os problemas menores so ordenados
independentemente.
Os resultados so combinados para produzir a soluo
final.
QuickSort
A parte mais delicada do mtodo o processo de
partio.
O vetor v[esq..dir] rearranjado por meio da escolha
arbitrria de um piv x.
O vetor v particionado em duas partes:
Parte esquerda: chaves x.
Parte direita: chaves x.
QuickSort Partio
Algoritmo para o particionamento:
1. Escolha arbitrariamente um piv x.
2. Percorra o vetor a partir da esquerda at que v[i] x.
3. Percorra o vetor a partir da direita at que v[j] x.
4. Troque v[i] com v[j].
5. Continue este processo at os apontadores i e j se
cruzarem.
QuickSort Exemplo
O piv x escolhido como sendo:
O elemento central: v[(i + j) / 2].
Exemplo:
QuickSort Exemplo
Primeira
partio
Segunda
partio
.
.
.
terceira
partio
Continua...
8
QuickSort Exemplo
quinta
partio
Final
quarta
partio
QUICKSORT
EXEMPLO DE EXECUO
QuickSort Execuo
A execuo do QuickSort pode ser facilmente descrita
por uma rvore binria
Cada n representa uma chamada recursiva do QuickSort
O n raiz a chamada inicial
Os ns folhas so vetores de 0 ou 1 nmero (casos bases)
7 4 9 6 2 2 4 6 7 9
4 2 2 4
22
7 9 7 9
99
11
7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9
7 2 9 4 2 4 7 9
22
3 8 6 1 1 3 8 6
9 4 4 9
99
33
88
44
12
7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 2 4 7 9
22
3 8 6 1 1 3 8 6
9 4 4 9
99
33
88
44
13
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 2 4 7
11
3 8 6 1 1 3 8 6
9 4 4 9
99
33
88
44
14
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 1 2 3 4
11
3 8 6 1 1 3 8 6
4 3 3 4
99
33
88
44
15
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 1 2 3 4
11
7 9 7 1 1 3 8 6
4 3 3 4
99
88
99
44
16
7 2 9 43 7 6 1 1 2 3 4 6 7 8 9
2 4 3 1 1 2 3 4
11
7 9 7 1 1 3 8 6
4 3 3 4
99
88
99
44
17
7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9
2 4 3 1 1 2 3 4
11
7 9 7 17 7 9
4 3 3 4
99
88
99
44
18
QUICKSORT
IMPLEMENTAO RECURSIVA
QuickSort - Funo
void QuickSort(TItem *v, int n) {
QuickSort_ordena(v, 0, n-1);
}
void QuickSort_ordena(TItem *v, int esq, int dir) {
int i, j;
QuickSort_particao(v, esq, dir, &i, &j);
if (esq < j) QuickSort_ordena(v, esq, j);
if (i < dir) QuickSort_ordena(v, i, dir);
}
20
QuickSort - Partio
void QuickSort_particao(TItem *v, int esq, int dir,
int *i, int *j) {
TItem pivo, aux;
*i = esq; *j = dir;
pivo = v[(*i + *j)/2]; /* obtem o pivo x */
do {
while (pivo.chave > v[*i].chave) (*i)++;
while (pivo.chave < v[*j].chave) (*j)--;
if (*i <= *j) {
aux = v[*i];
v[*i] = v[*j];
v[*j] = aux;
(*i)++; (*j)--;
}
} while (*i <= *j);
}
21
QuickSort
O anel interno da funo QuickSort_particao
extremamente simples.
Razo pela qual o algoritmo QuickSort to rpido.
22
QUICKSORT
ANLISE DO ALGORITMO
Anlise do QuickSort
Caractersticas:
Qual o pior caso para o QuickSort?
Por que?
Qual sua ordem de complexidade?
Qual o melhor caso?
O algoritmo estvel?
24
Anlise do QuickSort
Melhor caso: C(n) = 2C(n/2) + n = n log n
Ocorre quando o problema sempre divido em subproblemas
de igual tamanho aps a partio.
O(n) operaes por nvel
da rvore de execuo
h = O(log n)
25
Anlise do QuickSort
Pior caso: C(n) = O(n2)
O pior caso ocorre quando, sistematicamente, o piv
escolhido como sendo um dos extremos de um arquivo j
ordenado.
O(n) operaes por nvel
da rvore de execuo
h = O(n)
26
Anlise do QuickSort
Pior caso: C(n) = O(n2)
O pior caso pode ser evitado empregando pequenas
modificaes no algoritmo.
Para isso basta escolher trs itens quaisquer do vetor e usar a
mediana dos trs como piv.
27
Anlise do QuickSort
Caso mdio de acordo com Sedgewick e Flajolet
(1996, p. 17):
C(n) 1,386n log n 0,846n,
Isso significa que em mdia o tempo de execuo do
QuickSort cerca de O(n log n).
28
QUICKSORT
VANTAGENS/DESVANTAGENS
QuickSort
Vantagens:
extremamente eficiente para ordenar arquivos de dados.
Necessita de apenas uma pequena pilha como memria
auxiliar.
Requer O(n log n) comparaes em mdia (caso mdio) para
ordenar n itens.
30
QuickSort
Desvantagens:
Tem um pior caso O(n2) comparaes.
Sua implementao delicada e difcil:
Um pequeno engano pode levar a efeitos inesperados para
algumas entradas de dados.
O mtodo no estvel.
31
QUICKSORT
IMPLEMENTAO
NO-RECURSIVA
QuickSort No Recursivo
void QuickSort_iter(TItem *v, int n) {
TPilha pilha_dir, pilha_esq;
int esq, dir, i, j;
TPilha_Inicia(&pilha_dir);
TPilha_Inicia(&pilha_esq);
esq = 0;
dir = n-1;
TPilha_Push(&pilha_dir, dir);
TPilha_Push(&pilha_esq, esq);
// ... continua
33
QuickSort No Recursivo
// ... continuao:
do {
if (dir > esq) {
QuickSort_particao(v, esq, dir, &i, &j);
TPilha_Push(&pilha_dir, j);
TPilha_Push(&pilha_esq, esq);
esq = i;
}
else {
TPilha_Pop(&pilha_dir, &dir);
TPilha_Pop(&pilha_esq, &esq);
}
} while (!TPilha_EhVazia(&pilha_dir));
}
34
35
QuickSort
Vantagens da verso no-recursiva:
extremamente eficiente para ordenar arquivos de dados.
Necessita de apenas uma pequena pilha como memria
auxiliar.
36
QUICKSORT
MELHORIAS
38
Perguntas?
QUICKSORT
EXERCCIO
Exerccio
Dada a sequncia de nmeros:
349251863
Ordene em ordem crescente utilizando o algoritmo de
ordenao QuickSort, apresentado a sequncia dos
nmeros a cada passo.
41