SlideShare uma empresa Scribd logo
1 de 178
Baixar para ler offline
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Mais conteúdo relacionado

Mais procurados

Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
Ricardo Terra
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
UFPA
 

Mais procurados (8)

(ACH2002) Introdução à Análise de Algoritmos - Aula 03
(ACH2002) Introdução à Análise de Algoritmos - Aula 03(ACH2002) Introdução à Análise de Algoritmos - Aula 03
(ACH2002) Introdução à Análise de Algoritmos - Aula 03
 
(ACH2002) Introdução à Análise de Algoritmos - Aula 19
(ACH2002) Introdução à Análise de Algoritmos - Aula 19(ACH2002) Introdução à Análise de Algoritmos - Aula 19
(ACH2002) Introdução à Análise de Algoritmos - Aula 19
 
Casamento de Padrões
Casamento de PadrõesCasamento de Padrões
Casamento de Padrões
 
Matemática Computacional
Matemática ComputacionalMatemática Computacional
Matemática Computacional
 
(ACH2002) Introdução à Análise de Algoritmos - Aula 16
(ACH2002) Introdução à Análise de Algoritmos - Aula 16(ACH2002) Introdução à Análise de Algoritmos - Aula 16
(ACH2002) Introdução à Análise de Algoritmos - Aula 16
 
(ACH2002) Introdução à Análise de Algoritmos - Aula 20
(ACH2002) Introdução à Análise de Algoritmos - Aula 20(ACH2002) Introdução à Análise de Algoritmos - Aula 20
(ACH2002) Introdução à Análise de Algoritmos - Aula 20
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
 

Mais de Norton Trevisan Roman

Mais de Norton Trevisan Roman (20)

(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24
 
(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23
 
(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22
 
(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21
 
(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20
 
(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19
 
(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
 

Último

Os editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptxOs editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptx
TailsonSantos1
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
marlene54545
 
Aula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptxAula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptx
andrenespoli3
 
8 Aula de predicado verbal e nominal - Predicativo do sujeito
8 Aula de predicado verbal e nominal - Predicativo do sujeito8 Aula de predicado verbal e nominal - Predicativo do sujeito
8 Aula de predicado verbal e nominal - Predicativo do sujeito
tatianehilda
 

Último (20)

Seminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxSeminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptx
 
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
 
Os editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptxOs editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptx
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º ano
 
Aula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptxAula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptx
 
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUAO PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxSlides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVAEDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptx
 
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdfProjeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
Projeto_de_Extensão_Agronomia_adquira_ja_(91)_98764-0830.pdf
 
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdfTCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
 
Aula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIXAula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIX
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
8 Aula de predicado verbal e nominal - Predicativo do sujeito
8 Aula de predicado verbal e nominal - Predicativo do sujeito8 Aula de predicado verbal e nominal - Predicativo do sujeito
8 Aula de predicado verbal e nominal - Predicativo do sujeito
 
Aula de jornada de trabalho - reforma.ppt
Aula de jornada de trabalho - reforma.pptAula de jornada de trabalho - reforma.ppt
Aula de jornada de trabalho - reforma.ppt
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
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