Escolar Documentos
Profissional Documentos
Cultura Documentos
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
Introdução
• Proposto por Hoare em 1960 e publicado em 1962
Funcionamento Básico
• Divide o array em duas partes que serão independentemente ordenadas e
a combinação de seus resultados produz a solução final
Funcionamento Básico
• Particionamento:
Funcionamento Básico
• No final do particionamento, o array estará particionado de tal forma que:
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
Na primeira chamada, teremos:
{ swap(i, j); i++; j--; } quicksort(0, n-1)
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (11)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (12)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (13)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2]; (0 + 15) / 2: 7
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (14)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 0 <= 15: true
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (15)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 0 < 10: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (16)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (17)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 1 < 10: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (18)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (19)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 5 < 10: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (20)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (21)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 3 < 10: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (22)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (23)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 15 < 10: false
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (24)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 82 > 10: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (25)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (26)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 71 > 10: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (27)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (28)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 48 > 10: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (29)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (30)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 20 > 10: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (31)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (32)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 5 > 10: false
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (33)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j) 4 <= 11: true
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 15 16 9 10 4 3 30 5 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (34)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (35)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (36)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 5 <= 10: true
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (37)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 16 < 10: false
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (38)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 30 > 10: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (39)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (40)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 3 > 10: false
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (41)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j) 5 <= 9: true
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 16 9 10 4 3 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (42)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (43)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (44)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 6 <= 8: true
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (45)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 9 < 10: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (46)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (47)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 10 < 10: false
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (48)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 4 > 10: false
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (49)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j) 7 <= 8: true
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 10 4 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (50)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (51)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (52)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 8 <= 7: false
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (53)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j) 0 < 7: true
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (54)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (55)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô ?
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--; Obs(1): esq e dir são 0 e 7,
if (i <= j) respectivamente.
{ swap(i, j); i++; j--; }
}
Obs(2): o pivô será
if (esq < j)
quicksort(esq, j); definido novamente.
if (i < dir)
quicksort(i, dir);
}
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (56)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (57)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (58)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2]; (0 + 7) / 2: 3
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (59)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 0 <= 7: true
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (60)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 0 < 3: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (61)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (62)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 1 < 3: true
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (63)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (64)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 5 < 3: false
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (65)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 4 > 3: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (66)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (67)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 9 > 3: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (68)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (69)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 3 > 3: false
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (70)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j) 2 <= 5: true
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 5 3 5 3 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (71)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (72)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (73)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 3 <= 4: true
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (74)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo) 3 < 3: false
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (75)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 5 > 3: true
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (76)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (77)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo) 3 > 3: false
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (78)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j) 3 <= 3: true
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (79)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
i j
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (80)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--; Obs: O elemento [3] está
if (i <= j) na posição correta
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (81)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) { 4 <= 2: false
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (82)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j) 0 < 2: true
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (83)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 3
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
{ swap(i, j); i++; j--; }
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 3 3 5 5 9 4 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (84)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
Voltando para a primeira
{ swap(i, j); i++; j--; } chamada do Quicksort
}
if (esq < j)
quicksort(esq, j);
if (i < dir) 8 < 15: true
quicksort(i, dir);
}
j i
0 1 3 3 4 5 5 9 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (85)
Quicksort
Algoritmo em C like
void quicksort(int esq, int dir) {
pivô 10
int i = esq, j = dir, pivo = array[(esq+dir)/2];
while (i <= j) {
while (array[i] < pivo)
i++;
while (array[j] > pivo)
j--;
if (i <= j)
Voltando para a primeira
{ swap(i, j); i++; j--; } chamada do Quicksort
}
if (esq < j)
quicksort(esq, j);
if (i < dir)
quicksort(i, dir);
}
j i
0 1 3 3 4 5 5 9 10 16 30 15 20 48 71 82
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
esq dir
---------------------------- Algoritmos e Estruturas de Dados II (86)
Quicksort
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
4+4
2 + 2 + 2 +2
n comparações
realizadas lg n vezes
Θ(n * lg n)
4+4
2 + 2 + 2 +2
n comparações
realizadas lg n vezes
Θ(n * lg n)
4+4
2 + 2 + 2 +2
n comparações
realizadas lg n vezes
Θ(n * lg n)
4+4
2 + 2 + 2 +2
n comparações
realizadas lg n vezes
Θ(n * lg n)
4+4
2 + 2 + 2 +2
n comparações
realizadas em cada
um dos lg(n) passos
𝚯(n x lg n)
---------------------------- Algoritmos e Estruturas de Dados II (92)
Quicksort
n-1
n-2
... ...
1
n vezes = O(n2)
---------------------------- Algoritmos e Estruturas de Dados II (94)
Quicksort
n-1
n-2
... ...
1
n vezes = O(n2)
---------------------------- Algoritmos e Estruturas de Dados II (95)
Quicksort
n-1
n-2
... ...
1
n vezes = O(n2)
---------------------------- Algoritmos e Estruturas de Dados II (96)
Quicksort
n-1
n-2
... ...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (97)
Quicksort
n-1
n-2
... ...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (98)
Quicksort
n-1
n-2
... ...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (99)
Quicksort
n-1
n-2
... ...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (100)
Quicksort
n-1
n-2
... ...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (101)
Quicksort
n-1
n-2
... Somatório
de Gauss
...
1
n passos = 𝚯(n2)
---------------------------- Algoritmos e Estruturas de Dados II (102)
Quicksort
• Existem diversas técnicas para evitar o pior caso como, por exemplo, fazer
com que o pivô seja a mediana de três elementos do array
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
Informação Privilegiada
• Quando conhecemos a distribuição dos dados, podemos utilizar a
estratégia de escolha do pivô mais adequada àquela distribuição
Escolha Aleatória
• Escolher aleatoriamente um item da lista como pivô
Mediana de Três
• Escolhemos três elementos aleatoriamente
...
0 1 2 3 4 5 6 7 8 9 10 11 12 n-1
Elemento do Meio
• É uma técnica simples em que o pior caso do Quicksort acontece se,
sistematicamente, os elementos formarem uma espécie de triângulo
0 1 2 3 4 5 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9 10 11 12
Agenda
• Funcionamento básico
• Algoritmo em C like
• Escolha do Pivô
• Conclusão
Conclusão
• A razão de sua velocidade é a simplicidade do seu anel interno
• Vantagens:
• Extremamente eficiente
Conclusão
• Desvantagens:
Exercício (1)
• Mostre todas as comparações e movimentações do algoritmo anterior para
o array abaixo: