aula16-quicksort

19
 Quicksort David Menotti  Algo ritmos e Estr uturas de Dados I DECOM – UFOP

Upload: rafael-soares

Post on 12-Jul-2015

27 views

Category:

Documents


0 download

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%