aula16-quicksort
TRANSCRIPT
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 1/19
Quicksort
David Menotti
Algoritmos e Estruturas de Dados IDECOM – UFOP
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 2/19© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
Proposto por Hoare em 1960 e publicado em1962. É o algoritmo de ordenação interna mais rápido
que se conhece para uma ampla variedade desituações.
Provavelmente é o mais utilizado. A idéia básica é dividir o problema de ordenar
um conjunto com n itens em dois problemasmenores.
Os problemas menores são ordenadosindependentemente.
Os resultados são combinados para produzir asolução final.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 3/19© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
A parte mais delicada do método é oprocesso de partição.
O vetor A [Esq..Dir ] é rearranjado por meio
da escolha arbitrária de um pivô x. O vetor A é particionado em duas partes: Parte esquerda: chaves ≤ x. Parte direita: chaves ≥ x.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 4/19© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Partição
Algoritmo para o particionamento:1. Escolha arbitrariamente um pivô x.2. Percorra o vetor a partir da esquerda
até que A[i] ≥ x.3. Percorra o vetor a partir da direita atéque A[j] ≤ x.
4. Troque A[i] com A[j].
5. Continue este processo até osapontadores i e j se cruzarem.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 5/19© David Menotti Algoritmos e Estrutura de Dados I
Quicksort – Após a
Partição Ao final, do algoritmo de partição: o vetor A[Esq..Dir] está particionado de
tal forma que:Os itens em A[Esq], A[Esq + 1], ..., A[j]são menores ou iguais a x ;
Os itens em A[i], A[i + 1], ..., A[Dir] sãomaiores ou iguais a x .
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 6/19© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Exemplo
O pivô x é escolhido como sendo: O elemento central: A[(i + j) / 2].
Exemplo:
3 6 4 5 1 7 2
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 7/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Exemplo
3 6 4 5 1 7 2
3 2 4 1 5 7 6Primeirapartição
1 2 4 3 5 7 6Segundapartição
1 2 3 4 5 7 6terceirapartição
.
.
.
Continua...
Caso especial: pivô já naposição correta
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 8/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Exemplo
1 2 3 4 5 7 6
3 2 4 1 5 6 7quartapartição
1 2 4 3 5 6 7quintapartição
1 2 3 4 5 6 7Final
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 9/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Partição
void Particao(int Esq, int Dir,int *i, int *j, Item *A)
{
Item x, aux;
*i = Esq; *j = Dir;
x = A[(*i + *j)/2]; /* obtem o pivo x */
do
{
while (x.Chave > A[*i].Chave) (*i)++;
while (x.Chave < A[*j].Chave) (*j)--;
if (*i <= *j)
{aux = A[*i]; A[*i] = A[*j]; A[*j] = aux;
(*i)++; (*j)--;
}
} while (*i <= *j);
}
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 10/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
O anel interno da função Particao éextremamente simples.
Razão pela qual o algoritmo Quicksort é tãorápido.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 11/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort - Função
/* Entra aqui o procedimento Particao */void Ordena(int Esq, int Dir, Item *A)
{
int i,j;
Particao(Esq, Dir, &i, &j, A);
if (Esq < j) Ordena(Esq, j, A);
if (i < Dir) Ordena(i, Dir, A);
}
void QuickSort(Item *A, int n)
{Ordena(0, n-1, A);
//Ordena(1, *n, A);
}
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 12/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
Características
Qual o pior caso para o Quicksort? Por que? Qual sua ordem de complexidade?
Qual o melhor caso?
O algoritmo é estável?
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 13/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
Análise Seja C(n) a função que conta o número decomparações.
Pior caso: C(n) = O(n2) O pior caso ocorre quando, sistematicamente, o pivô é
escolhido como sendo um dos extremos de um arquivo jáordenado. Isto faz com que o procedimento Ordena seja chamado
recursivamente n vezes, eliminando apenas um item emcada chamada.
O pior caso pode ser evitado empregando pequenas
modificações no algoritmo. Para isso basta escolher três itens quaisquer do vetor e usar
a mediana dos três como pivô.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 14/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
Análise Melhor caso:
C(n) = 2C(n/2) + n = n log n Esta situação ocorre quando cada partição divide o
arquivo em duas partes iguais.
Caso médio de acordo com Sedgewick e Flajolet(1996, p. 17):
C(n) ≈ 1,386n log n – 0,846n, Isso significa que em média o tempo de execução do
Quicksort é O(n log n).
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 15/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort
Vantagens: É extremamente eficiente para ordenar arquivosde dados.
Necessita de apenas uma pequena pilha comomemória auxiliar.
Requer cerca de n log n comparações em médiapara ordenar n itens.
Desvantagens: Tem um pior caso O(n2) comparações. Sua implementação é muito delicada e difícil:
Um pequeno engano pode levar a efeitos inesperadospara algumas entradas de dados.
O método não é estável.
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 16/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort Não Recursivovoid QuickSortNaoRec (Vetor A, Indice n)
{
TipoPilha pilha; TipoItem item;
int esq, dir, i, j;
FPVazia(&pilha);
esq = 0;
dir = n-1;
item.dir = dir;
item.esq = esq;
Empilha(item,&pilha);
doif (dir > esq) {
Particao(A,esq,dir,&i, &j);
item.dir = j;
item.esq = esq;
Empilha(item,&pilha);
esq = i;
}
else {
Desempilha(&pilha,&item);
dir = item.dir;
esq = item.esq;
}
while (!Vazia(pilha));
}
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 17/19
© David Menotti Algoritmos e Estrutura de Dados I
Quicksort Não Recursivovoid QuickSortNaoRec (Vetor A, Indice n)
{
TipoPilha pilha; TipoItem item;
int esq, dir, i, j;
FPVazia(&pilha);
esq = 0;
dir = n-1;
item.dir = dir;
item.esq = esq;
Empilha(item, &pilha);
doif (dir > esq) {
Particao(A,esq,dir,&i, &j);
if ((j-esq)>(dir-i)) {
item.dir = j;
item.esq = esq;
Empilha(item, &pilha);
esq = i;
}
else {
item.esq = i;
item.dir = dir;
Empilha(item, &pilha);
dir = j;
}
}
else {
Desempilha(&pilha,&item);
dir = item.dir;
esq = item.esq;
}
while (!Vazia(pilha));}
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 18/19
© David Menotti Algoritmos e Estrutura de Dados I
Pilha de Recursão x Pilha noAlgoritmo Não Recursivo
O que é colocado em cada uma das pilhas?
Que intervalo do vetor é empilhado em cadacaso?
5/11/2018 aula16-QuickSort - slidepdf.com
http://slidepdf.com/reader/full/aula16-quicksort 19/19
© David Menotti Algoritmos e Estrutura de Dados I
Melhorias no Quicksort Pivô – Mediana de três
Não empilhar quando tem um só
Melhor ainda: usar algoritmo de inserçãopara vetores pequenos (menos de 10 ou 20elementos)
Escolha do lado a ser empilhado
Melhoria no tempo de execução de 25% a 30%