O documento descreve o algoritmo de ordenação QuickSort, que utiliza a técnica de divisão e conquista. QuickSort divide o arranjo de entrada em dois sub-arranjos, ordena os sub-arranjos recursivamente e combina os resultados para ordenar o arranjo completo. O particionamento do arranjo é a etapa chave que divide o problema em subproblemas menores.
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
(ACH2002) Introdução à Análise de Algoritmos - Aula 14
1. Aula 14 – Algoritmos de Ordena¸c˜ao:
Divis˜ao e Conquista (QuickSort)
Norton Trevisan Roman
norton@usp.br
4 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 1 / 28
2. Ordena¸c˜ao
Vimos que algoritmos de ordena¸c˜ao, no modelo
incremental, utilizam a indu¸c˜ao fraca
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 2 / 28
3. Ordena¸c˜ao
Vimos que algoritmos de ordena¸c˜ao, no modelo
incremental, utilizam a indu¸c˜ao fraca
Assume-se T(n − 1) para ordenar um arranjo de n elementos
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 2 / 28
4. Ordena¸c˜ao
Vimos que algoritmos de ordena¸c˜ao, no modelo
incremental, utilizam a indu¸c˜ao fraca
Assume-se T(n − 1) para ordenar um arranjo de n elementos
Ex: Inser¸c˜ao e Sele¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 2 / 28
5. Ordena¸c˜ao
Vimos que algoritmos de ordena¸c˜ao, no modelo
incremental, utilizam a indu¸c˜ao fraca
Assume-se T(n − 1) para ordenar um arranjo de n elementos
Ex: Inser¸c˜ao e Sele¸c˜ao
Tamb´em vimos que, na divis˜ao e conquista, ´e
necess´ario utilizar a indu¸c˜ao forte
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 2 / 28
6. Ordena¸c˜ao
Vimos que algoritmos de ordena¸c˜ao, no modelo
incremental, utilizam a indu¸c˜ao fraca
Assume-se T(n − 1) para ordenar um arranjo de n elementos
Ex: Inser¸c˜ao e Sele¸c˜ao
Tamb´em vimos que, na divis˜ao e conquista, ´e
necess´ario utilizar a indu¸c˜ao forte
Assumir T(k), onde cbase ≤ k ≤ (n − 1), para ordenar um
arranjo de n elementos
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 2 / 28
7. Projeto por Indu¸c˜ao Forte
Padr˜ao Divis˜ao e Conquista:
Ordena¸c~aoD&C(A, ini, fim):
Entrada: Arranjo A de n valores
Sa´ıda: Arranjo A ordenado
n = fim - ini + 1
se n == 1 ent~ao retorne
sen~ao:
<comandos iniciais: a divis~ao> (c´alculo de q)
Ordena¸c~aoD&C(A, ini, q)
Ordena¸c~aoD&C(A, q+1, fim)
<comandos finais: a combina¸c~ao da conquista>
retorne
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 3 / 28
8. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
9. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
10. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
11. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
12. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Seja S um conjunto de n ≥ 2 valores, e x um elemento
qualquer de S, e sejam S1 e S2 os subconjuntos de S − x
dos elementos menores ou iguais a x e maiores que x,
respectivamente
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
13. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Seja S um conjunto de n ≥ 2 valores, e x um elemento
qualquer de S, e sejam S1 e S2 os subconjuntos de S − x
dos elementos menores ou iguais a x e maiores que x,
respectivamente
Pela H.I., sabemos ordenar os conjuntos S1 e S2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 4 / 28
14. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Passo (cont.):
Podemos ent˜ao ter S ordenado concatenando S1 ordenado,
x e S2 ordenado (S1 + x + S2)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 5 / 28
15. Projeto por Indu¸c˜ao Forte
Primeira Alternativa
Passo (cont.):
Podemos ent˜ao ter S ordenado concatenando S1 ordenado,
x e S2 ordenado (S1 + x + S2)
Esta indu¸c˜ao d´a origem ao algoritmo de divis˜ao e
conquista QuickSort
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 5 / 28
16. QuickSort
Passos para ordenar um subarranjo A[p..r]
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 6 / 28
17. QuickSort
Passos para ordenar um subarranjo A[p..r]
Dividir:
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 6 / 28
18. QuickSort
Passos para ordenar um subarranjo A[p..r]
Dividir:
Particione (reorganize) o arranjo A[p..r] em dois
sub-arranjos (possivelmente vazios) A[p..q − 1] e A[q + 1..r]
de modo a que todo elemento de A[p..q − 1] seja menor ou
igual a A[q], e que todo elemento de A[q + 1..r] seja maior
ou igual a A[q]
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 6 / 28
19. QuickSort
Passos para ordenar um subarranjo A[p..r]
Dividir:
Particione (reorganize) o arranjo A[p..r] em dois
sub-arranjos (possivelmente vazios) A[p..q − 1] e A[q + 1..r]
de modo a que todo elemento de A[p..q − 1] seja menor ou
igual a A[q], e que todo elemento de A[q + 1..r] seja maior
ou igual a A[q]
O ´ındice q ´e calculado como parte desse procedimento de
particionamento
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 6 / 28
20. QuickSort
Passos para ordenar um subarranjo A[p..r]
Conquistar:
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 7 / 28
21. QuickSort
Passos para ordenar um subarranjo A[p..r]
Conquistar:
Ordene os sub-arranjos A[p..q − 1] e A[q + 1..r]
recursivamente
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 7 / 28
22. QuickSort
Passos para ordenar um subarranjo A[p..r]
Conquistar:
Ordene os sub-arranjos A[p..q − 1] e A[q + 1..r]
recursivamente
Combinar:
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 7 / 28
23. QuickSort
Passos para ordenar um subarranjo A[p..r]
Conquistar:
Ordene os sub-arranjos A[p..q − 1] e A[q + 1..r]
recursivamente
Combinar:
Uma vez que os sub-arranjos s˜ao ordenados no pr´oprio
arranjo A, n˜ao ´e preciso fazer nada para combin´a-los
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 7 / 28
24. QuickSort
Passos para ordenar um subarranjo A[p..r]
Conquistar:
Ordene os sub-arranjos A[p..q − 1] e A[q + 1..r]
recursivamente
Combinar:
Uma vez que os sub-arranjos s˜ao ordenados no pr´oprio
arranjo A, n˜ao ´e preciso fazer nada para combin´a-los
O arranjo A[p..r] todo est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 7 / 28
25. QuickSort
C´odigo
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 8 / 28
26. QuickSort
C´odigo
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Embora combinar n˜ao custe nada, dividir pode ser
caro...
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 8 / 28
27. Quicksort
Particionando o arranjo
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
28. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
29. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
30. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
31. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
32. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
33. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
34. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
35. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
36. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
37. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
38. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
39. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
40. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
41. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
42. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
43. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
44. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
45. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
46. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
47. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
48. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
49. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
50. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
51. Quicksort
Particionando o arranjo
2 8 7 1 3 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
52. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
53. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
54. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
55. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
56. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
57. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
58. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
59. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
60. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
61. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
62. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
63. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
64. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
65. Quicksort
Particionando o arranjo
2 3 7 1 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
66. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
67. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
68. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
i j
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
69. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
70. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
71. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
72. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
73. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
74. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
75. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 4
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
76. Quicksort
Particionando o arranjo
2 3 1 7 8 5 6 7
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
77. Quicksort
Particionando o arranjo
2 3 1 4 8 5 6 7
ini fim
x = 4
ij
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
78. Quicksort
Particionando o arranjo
2 3 1 4 8 5 6 7
ini fim
x = 4
ij
i ´e o pivˆo a partir do
qual a parti¸c˜ao ´e feita
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
79. Quicksort
Particionando o arranjo
2 3 1 4 8 5 6 7
ini fim
x = 4
ij
i ´e o pivˆo a partir do
qual a parti¸c˜ao ´e feita
`A esquerda de i h´a os
valores ≤ i, enquanto
que `a direita h´a os > i
int particao (int[] A, int ini, int fim) {
int i, j, temp;
int x = A[fim]; //piv^o
i = ini;
j = fim - 1;
while (i <= j) {
if(A[i] <= x) i++;
else
if (A[j] > x) j--;
else { //troca A[i] e A[j]
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
A[fim] = A[i]; //reposiciona o piv^o
A[i] = x;
return(i);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 9 / 28
80. Quicksort
Ordenando
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
81. Quicksort
Ordenando
2 8 7 1 3 5 6 4
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
82. Quicksort
Ordenando
2 8 7 1 3 5 6 4
ini
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
83. Quicksort
Ordenando
2 8 7 1 3 5 6 4
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
84. Quicksort
Ordenando
2 8 7 1 3 5 6 4
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
85. Quicksort
Ordenando
2 3 1 4 8 5 6 7
ini fimq
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
86. Quicksort
Ordenando
2 3 1 4 8 5 6 7
ini fimq
2 3 1
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
87. Quicksort
Ordenando
2 3 1 4 8 5 6 7
ini fimq
2 3 1
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
88. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
89. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
1
inifim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
90. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
1
inifim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
91. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
92. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
3 2
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
93. Quicksort
Ordenando
1 3 2 4 8 5 6 7
ini fimq
1 3 2
ini fim,q
3 2
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
94. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
95. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
2
ini,fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
96. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
2
ini,fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
97. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
98. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
3
fim ini
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
99. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
3
fim ini
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
100. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
2 3
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
101. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
1 2 3
ini fim,q
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
102. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
103. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
8 5 6 7
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
104. Quicksort
Ordenando
1 2 3 4 8 5 6 7
ini fimq
8 5 6 7
ini fim
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
105. Quicksort
Ordenando
1 2 3 4 6 5 7 8
ini fimq
6 5 7 8
ini fimq
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
106. Quicksort
Ordenando
1 2 3 4 6 5 7 8
ini fimq
6 5 7 8
ini fimq
E assim por diante . . .
Chamadas:
void quickSort(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particao(A, ini, fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 10 / 28
107. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
108. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
E isso, por sua vez, depende do pivˆo usado
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
109. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
E isso, por sua vez, depende do pivˆo usado
Pior caso: O particionamento resulta em n − 1
elementos de um lado e 0 do outro
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
110. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
E isso, por sua vez, depende do pivˆo usado
Pior caso: O particionamento resulta em n − 1
elementos de um lado e 0 do outro
Note que uma posi¸c˜ao foi reservada para o pivˆo, por isso, a
soma do tamanho dos dois sub-arranjos ´e n − 1
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
111. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
E isso, por sua vez, depende do pivˆo usado
Pior caso: O particionamento resulta em n − 1
elementos de um lado e 0 do outro
Note que uma posi¸c˜ao foi reservada para o pivˆo, por isso, a
soma do tamanho dos dois sub-arranjos ´e n − 1
E quando isso ocorre?
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
112. Quicksort
Desempenho
O desempenho do QuickSort depende do
particionamento ser balanceado ou n˜ao
E isso, por sua vez, depende do pivˆo usado
Pior caso: O particionamento resulta em n − 1
elementos de um lado e 0 do outro
Note que uma posi¸c˜ao foi reservada para o pivˆo, por isso, a
soma do tamanho dos dois sub-arranjos ´e n − 1
E quando isso ocorre?
Quando o arranjo j´a est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 11 / 28
113. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
114. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
Supondo que esse
particionamento se
repita em cada
chamada recursiva,
temos
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
T(n) =
se n = 1
para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
115. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
Supondo que esse
particionamento se
repita em cada
chamada recursiva,
temos
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
T(n) =
Θ(1) se n = 1
para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
116. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
Supondo que esse
particionamento se
repita em cada
chamada recursiva,
temos
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
T(n) =
Θ(1) se n = 1
Θ(n) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
117. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
Supondo que esse
particionamento se
repita em cada
chamada recursiva,
temos
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
118. Quicksort
Desempenho: pior caso
E qual o custo do
Quicksort?
Supondo que esse
particionamento se
repita em cada
chamada recursiva,
temos
void quickSort(int[] A, int ini,
int fim) {
if (ini < fim) {
int q = particao(A, ini,
fim);
quickSort(A, ini, q-1);
quickSort(A, q + 1, fim);
}
}
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) + T(0) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 12 / 28
119. Quicksort
Desempenho: pior caso
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) + T(0) para n ≥ 2
Por que o particionamento ´e Θ(n)?
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 13 / 28
120. Quicksort
Desempenho: pior caso
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) + T(0) para n ≥ 2
Por que o particionamento ´e Θ(n)?
Para fazer o particionamento, ser˜ao necess´arias sempre n
compara¸c˜oes
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 13 / 28
121. Quicksort
Desempenho: pior caso
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) + T(0) para n ≥ 2
Por que o particionamento ´e Θ(n)?
Para fazer o particionamento, ser˜ao necess´arias sempre n
compara¸c˜oes
E quanto ´e T(0)?
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 13 / 28
122. Quicksort
Desempenho: pior caso
T(n) =
Θ(1) se n = 1
Θ(n) + T(n − 1) + T(0) para n ≥ 2
Por que o particionamento ´e Θ(n)?
Para fazer o particionamento, ser˜ao necess´arias sempre n
compara¸c˜oes
E quanto ´e T(0)?
Cai no mesmo caso do T(1) no c´odigo, ou seja, Θ(1)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 13 / 28
123. Quicksort
Desempenho: pior caso
Ent˜ao a rela¸c˜ao fica:
T(n) = Θ(n) + T(n − 1) + Θ(1)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 14 / 28
124. Quicksort
Desempenho: pior caso
Ent˜ao a rela¸c˜ao fica:
T(n) = Θ(n) + T(n − 1) + Θ(1)
= T(n − 1) + Θ(n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 14 / 28
125. Quicksort
Desempenho: pior caso
Ent˜ao a rela¸c˜ao fica:
T(n) = Θ(n) + T(n − 1) + Θ(1)
= T(n − 1) + Θ(n)
= Θ(n2
)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 14 / 28
126. Quicksort
Desempenho: pior caso
Ent˜ao a rela¸c˜ao fica:
T(n) = Θ(n) + T(n − 1) + Θ(1)
= T(n − 1) + Θ(n)
= Θ(n2
)
Ou seja, no pior caso, com o particionamento
desbalanceado ao m´aximo, o tempo ´e o mesmo da
Sele¸c˜ao, Inser¸c˜ao e Bolha
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 14 / 28
127. Quicksort
Desempenho: pior caso
Ent˜ao a rela¸c˜ao fica:
T(n) = Θ(n) + T(n − 1) + Θ(1)
= T(n − 1) + Θ(n)
= Θ(n2
)
Ou seja, no pior caso, com o particionamento
desbalanceado ao m´aximo, o tempo ´e o mesmo da
Sele¸c˜ao, Inser¸c˜ao e Bolha
Com o agravante de que, se a entrada estiver ordenada, a
Inser¸c˜ao roda em tempo O(n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 14 / 28
128. Quicksort
Desempenho: melhor caso
No melhor particionamento poss´ıvel, teremos 2
sub-problemas, de tamanhos n/2 e (n/2 − 1)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 15 / 28
129. Quicksort
Desempenho: melhor caso
No melhor particionamento poss´ıvel, teremos 2
sub-problemas, de tamanhos n/2 e (n/2 − 1)
Mais uma vez, uma posi¸c˜ao foi reservada para o pivˆo
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 15 / 28
130. Quicksort
Desempenho: melhor caso
No melhor particionamento poss´ıvel, teremos 2
sub-problemas, de tamanhos n/2 e (n/2 − 1)
Mais uma vez, uma posi¸c˜ao foi reservada para o pivˆo
Nesse caso, repetindo o procedimento anterior
teremos
T(n) =
Θ(1) se n = 1
2T(n/2) + Θ(n) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 15 / 28
131. Quicksort
Desempenho: melhor caso
No melhor particionamento poss´ıvel, teremos 2
sub-problemas, de tamanhos n/2 e (n/2 − 1)
Mais uma vez, uma posi¸c˜ao foi reservada para o pivˆo
Nesse caso, repetindo o procedimento anterior
teremos
T(n) =
Θ(1) se n = 1
2T(n/2) + Θ(n) para n ≥ 2
E, pelo teorema mestre (caso 2), temos que
T(n) = Θ(n log n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 15 / 28
132. Quicksort
Particionamento Balanceado
O tempo de execu¸c˜ao do caso m´edio do QuickSort ´e
muito mais pr´oximo do melhor caso do que do pior
caso
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 16 / 28
133. Quicksort
Particionamento Balanceado
O tempo de execu¸c˜ao do caso m´edio do QuickSort ´e
muito mais pr´oximo do melhor caso do que do pior
caso
Para entender isto, considere um particionamento
que sempre produza uma divis˜ao proporcional de 9
para 1
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 16 / 28
134. Quicksort
Particionamento Balanceado
O tempo de execu¸c˜ao do caso m´edio do QuickSort ´e
muito mais pr´oximo do melhor caso do que do pior
caso
Para entender isto, considere um particionamento
que sempre produza uma divis˜ao proporcional de 9
para 1
Isso parece bastante desbalanceado, possuindo a recorrˆencia
T(n) = T(9n/10) + T(n/10) + cn
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 16 / 28
135. Quicksort
Particionamento Balanceado
Expandindo a ´arvore de recurs˜ao temos
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 17 / 28
136. Quicksort
Particionamento Balanceado
Expandindo a ´arvore de recurs˜ao temos
Ou seja, o custo total do quicksort, mesmo com esse
particionamento, ´e O(n log n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 17 / 28
137. Quicksort
Intui¸c˜ao para o caso m´edio
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 18 / 28
138. Quicksort
Intui¸c˜ao para o caso m´edio
No caso m´edio, todas as permuta¸c˜oes dos valores de
entrada s˜ao igualmente prov´aveis
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 18 / 28
139. Quicksort
Intui¸c˜ao para o caso m´edio
No caso m´edio, todas as permuta¸c˜oes dos valores de
entrada s˜ao igualmente prov´aveis
Para um arranjo de entrada aleat´oria ´e improv´avel
que o particionamento ocorra sempre do mesmo
modo em todo n´ıvel (como suposto na an´alise
informal anterior)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 18 / 28
140. Quicksort
Intui¸c˜ao para o caso m´edio
No caso m´edio, todas as permuta¸c˜oes dos valores de
entrada s˜ao igualmente prov´aveis
Para um arranjo de entrada aleat´oria ´e improv´avel
que o particionamento ocorra sempre do mesmo
modo em todo n´ıvel (como suposto na an´alise
informal anterior)
O esperado ´e que haja algumas divis˜oes boas e outras ruins,
distribu´ıdas aleatoriamente ao longo da ´arvore
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 18 / 28
141. Quicksort
Intui¸c˜ao para o caso m´edio
Suponha, no entanto, que parti¸c˜oes boas e ruins se
alternem nos n´ıveis da ´arvore
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 19 / 28
142. Quicksort
Intui¸c˜ao para o caso m´edio
Suponha, no entanto, que parti¸c˜oes boas e ruins se
alternem nos n´ıveis da ´arvore
Suponha tamb´em que as boas parti¸c˜oes s˜ao do
melhor caso, enquanto que as ruins s˜ao do pior caso
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 19 / 28
143. Quicksort
Intui¸c˜ao para o caso m´edio
Suponha, no entanto, que parti¸c˜oes boas e ruins se
alternem nos n´ıveis da ´arvore
Suponha tamb´em que as boas parti¸c˜oes s˜ao do
melhor caso, enquanto que as ruins s˜ao do pior caso
2 n´ıveis consecutivos da
´arvore de recurs˜ao (pior e
melhor caso):
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 19 / 28
144. Quicksort
Intui¸c˜ao para o caso m´edio
Ent˜ao temos:
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 20 / 28
145. Quicksort
Intui¸c˜ao para o caso m´edio
Ent˜ao temos:
Primeira divis˜ao (ruim):
T(0) + T(n − 1)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 20 / 28
146. Quicksort
Intui¸c˜ao para o caso m´edio
Ent˜ao temos:
Primeira divis˜ao (ruim):
T(0) + T(n − 1)
Segunda divis˜ao (boa):
T(n−1
2
) + T(n−1
2
)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 20 / 28
147. Quicksort
Intui¸c˜ao para o caso m´edio
Ent˜ao temos:
Primeira divis˜ao (ruim):
T(0) + T(n − 1)
Segunda divis˜ao (boa):
T(n−1
2
) + T(n−1
2
)
E, combinando, temos T(0) + T(n−1
2
) + T(n−1
2
)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 20 / 28
148. Quicksort
Intui¸c˜ao para o caso m´edio
Ent˜ao temos:
Primeira divis˜ao (ruim):
T(0) + T(n − 1)
Segunda divis˜ao (boa):
T(n−1
2
) + T(n−1
2
)
E, combinando, temos T(0) + T(n−1
2
) + T(n−1
2
)
Ou seja, o custo da divis˜ao ruim (T(n − 1)) ´e absorvido pela
divis˜ao boa (T(n−1
2
))
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 20 / 28
149. Quicksort
Intui¸c˜ao para o caso m´edio
Portanto, o tempo de
execu¸c˜ao do QuickSort,
quando os n´ıveis se
alternam entre divis˜oes
boas e ruins, ´e
semelhante ao custo
para as divis˜oes boas
sozinhas
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 21 / 28
150. Quicksort
Intui¸c˜ao para o caso m´edio
Portanto, o tempo de
execu¸c˜ao do QuickSort,
quando os n´ıveis se
alternam entre divis˜oes
boas e ruins, ´e
semelhante ao custo
para as divis˜oes boas
sozinhas
Ainda ´e T(n) = O(n log n), mas com uma
constante maior
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 21 / 28
151. Quicksort
Aproximando-se do caso m´edio
Nem sempre as poss´ıveis entradas s˜ao equiprov´aveis
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 22 / 28
152. Quicksort
Aproximando-se do caso m´edio
Nem sempre as poss´ıveis entradas s˜ao equiprov´aveis
Ex: Cheques s˜ao registrados na ordem temporal
(data) em que s˜ao descontados
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 22 / 28
153. Quicksort
Aproximando-se do caso m´edio
Nem sempre as poss´ıveis entradas s˜ao equiprov´aveis
Ex: Cheques s˜ao registrados na ordem temporal
(data) em que s˜ao descontados
O banco pode querer uma listagem ordenada pelo n´umero
do cheque (e.g., 86781, 86782,...)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 22 / 28
154. Quicksort
Aproximando-se do caso m´edio
Nem sempre as poss´ıveis entradas s˜ao equiprov´aveis
Ex: Cheques s˜ao registrados na ordem temporal
(data) em que s˜ao descontados
O banco pode querer uma listagem ordenada pelo n´umero
do cheque (e.g., 86781, 86782,...)
Normalmente, os cheques s˜ao emitidos e descontados na
ordem do tal˜ao, mas nem sempre. `As vezes, o comerciante
pode dar um prazo a mais (cheque pr´e-datado) e demorar
para descontar o cheque
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 22 / 28
155. Quicksort
Aproximando-se do caso m´edio
Nem sempre as poss´ıveis entradas s˜ao equiprov´aveis
Ex: Cheques s˜ao registrados na ordem temporal
(data) em que s˜ao descontados
O banco pode querer uma listagem ordenada pelo n´umero
do cheque (e.g., 86781, 86782,...)
Normalmente, os cheques s˜ao emitidos e descontados na
ordem do tal˜ao, mas nem sempre. `As vezes, o comerciante
pode dar um prazo a mais (cheque pr´e-datado) e demorar
para descontar o cheque
Ou seja: a sequˆencia temporal dos cheques est´a quase
ordenada por n´umero de cheque
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 22 / 28
156. Quicksort
Aproximando-se do caso m´edio
Nesta situa¸c˜ao, o QuickSort vai ter um desempenho
ruim
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 23 / 28
157. Quicksort
Aproximando-se do caso m´edio
Nesta situa¸c˜ao, o QuickSort vai ter um desempenho
ruim
´E ent˜ao necess´ario aproximar-se do caso m´edio
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 23 / 28
158. Quicksort
Aproximando-se do caso m´edio
Nesta situa¸c˜ao, o QuickSort vai ter um desempenho
ruim
´E ent˜ao necess´ario aproximar-se do caso m´edio
Como?
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 23 / 28
159. Quicksort
Aproximando-se do caso m´edio
Nesta situa¸c˜ao, o QuickSort vai ter um desempenho
ruim
´E ent˜ao necess´ario aproximar-se do caso m´edio
Como?
Uma maneira de aproximar-se do caso m´edio ´e
escolhendo aleatoriamente um pivˆo, ao inv´es de
utilizar sempre o ´ultimo elemento
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 23 / 28
160. Quicksort
Aproximando-se do caso m´edio
Nesta situa¸c˜ao, o QuickSort vai ter um desempenho
ruim
´E ent˜ao necess´ario aproximar-se do caso m´edio
Como?
Uma maneira de aproximar-se do caso m´edio ´e
escolhendo aleatoriamente um pivˆo, ao inv´es de
utilizar sempre o ´ultimo elemento
T´ecnica conhecida como amostragem aleat´oria
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 23 / 28
161. Quicksort
Aproximando-se do caso m´edio
E como fazemos isso?
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 24 / 28
162. Quicksort
Aproximando-se do caso m´edio
E como fazemos isso?
Trocando o elemento A[fim] por um elemento escolhido
aleatoriamente do sub-arranjo A[ini..fim]
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 24 / 28
163. Quicksort
Aproximando-se do caso m´edio
E como fazemos isso?
Trocando o elemento A[fim] por um elemento escolhido
aleatoriamente do sub-arranjo A[ini..fim]
Isso faz com que o pivˆo (A[fim]) tenha a mesma
chance de ser qualquer elemento do sub-arranjo
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 24 / 28
164. Quicksort
Aproximando-se do caso m´edio
E como fazemos isso?
Trocando o elemento A[fim] por um elemento escolhido
aleatoriamente do sub-arranjo A[ini..fim]
Isso faz com que o pivˆo (A[fim]) tenha a mesma
chance de ser qualquer elemento do sub-arranjo
Uma vez que o pivˆo ´e escolhido aleatoriamente, esperamos
que a parti¸c˜ao do arranjo fique na m´edia razoavelmente bem
balanceada
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 24 / 28
165. Quicksort
Parti¸c˜ao aleat´oria
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
166. Quicksort
Parti¸c˜ao aleat´oria
Retorna um real
f , 0 ≤ f < 1
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
167. Quicksort
Parti¸c˜ao aleat´oria
i ´e tal que
ini ≤ i < fim
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
168. Quicksort
Parti¸c˜ao aleat´oria
Escolhe um n´umero
aleat´orio entre ini e
fim (sem incluir fim)
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
169. Quicksort
Parti¸c˜ao aleat´oria
Troca de posi¸c˜ao
A[i] e A[fim]
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
170. Quicksort
Parti¸c˜ao aleat´oria
Note que simplesmente
implementamos a
troca antes de efeti-
vamente particionar
int particaoAleatoria (int[] A, int ini, int fim) {
int i, temp;
double f;
f = java.lang.Math.random();
i = (int)(ini + (fim - ini) * f);
temp = A[fim];
A[fim] = A[i];
A[i] = temp;
return particao(A, ini, fim);
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 25 / 28
171. Quicksort
Quicksort aleat´orio
void quickSortAleatorio(int[] A, int ini, int fim) {
if (ini < fim) {
int q = particaoAleatoria(A, ini, fim);
quickSortAleatorio(A, ini, q - 1);
quickSortAleatorio(A, q + 1, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 26 / 28
172. Quicksort
Em suma
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
173. Quicksort
Em suma
O Quicksort trabalha com ordena¸c˜ao local (in loco
ou in-place)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
174. Quicksort
Em suma
O Quicksort trabalha com ordena¸c˜ao local (in loco
ou in-place)
Utiliza quantidade de mem´oria constante, al´em do pr´oprio
arranjo
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
175. Quicksort
Em suma
O Quicksort trabalha com ordena¸c˜ao local (in loco
ou in-place)
Utiliza quantidade de mem´oria constante, al´em do pr´oprio
arranjo
Pior caso: O(n2
)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
176. Quicksort
Em suma
O Quicksort trabalha com ordena¸c˜ao local (in loco
ou in-place)
Utiliza quantidade de mem´oria constante, al´em do pr´oprio
arranjo
Pior caso: O(n2
)
Melhor caso: O(n log n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
177. Quicksort
Em suma
O Quicksort trabalha com ordena¸c˜ao local (in loco
ou in-place)
Utiliza quantidade de mem´oria constante, al´em do pr´oprio
arranjo
Pior caso: O(n2
)
Melhor caso: O(n log n)
Caso m´edio: O(n log n)
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 27 / 28
178. Referˆencias
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Material baseado em slides dos professores Delano Beder e
Marcos Chain
Norton Trevisan Romannorton@usp.br Aula 14 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (QuickSort)4 de outubro de 2018 28 / 28