Métodos de Ordenação Parte 3 - ?· Método Heapsort - Descrição do Algoritmo O processo de troca…

Embed Size (px)

Text of Métodos de Ordenação Parte 3 - ?· Método Heapsort - Descrição do Algoritmo O processo de...

Estrutura de Dados II

Mtodos de OrdenaoParte 3

Profa Mrcio Bueno

ed2tarde@marciobueno.com / ed2noite@marciobueno.com

Material baseado nos materiais do Prof. Robson Lins

Estrutura de Dados II - Mrcio Bueno 2

Mtodos Eficientes (Sofisticados)Classificao por Troca

Mtodo de Partio e Troca - Quicksort

Classificao por Seleo

Mtodo de Seleo em rvore - Heapsort

Classificao em Memria Primria

Estrutura de Dados II - Mrcio Bueno 3

Classificao por Troca - Quicksort Proposto por Hoare e tem como base dois

princpios:RecursividadeAbordagem dividir para conquistar

Consiste em:Dado um conjunto C de elementos a ser ordenadoEscolher qualquer elemento k do conjunto C para

dividir o conjunto em elementos pequenos e grandes. Este elemento chamado de piv.

Dividir C em dois sub-conjuntos C1 e C2, onde os elementos de C1 so menores que o piv e os elementos de C2 so maiores que o piv.

Repete-se o processo em C1 e C2

Estrutura de Dados II - Mrcio Bueno 4

Classificao por Troca - Quicksort Diagrama:

Idealmente, o piv deveria ser selecionado de modo que aproximadamente metade dos elementos ficassem a esquerda do piv e a outra metade do lado direito do piv.

Considere o caso onde o menor ou o maior elemento escolhido como piv. Nesse caso um conjunto (C1) ficaria vazio e o outro (C2) com n-1 elementos.

p

in[p]

0 1 2 p-1

< in[p]

N-2 N-1p+1

> in[p]

Estrutura de Dados II - Mrcio Bueno 5

Classificao por Troca - Quicksort Escolha do Piv Depende da implementaoUsar o primeiro elemento

Aceitvel se a entrada aleatria

Se a entrada for pr-ordenada ou estiver na ordem inversa uma pssima escolha

Escolha aleatria Estratgia segura de um modo geral

A gerao de nmeros aleatrios no implica em um desempenho melhor no restante do algoritmo

Mdia das entradas Difcil de calcular

Prejudicaria o desempenho

Pegar 3 elementos e calcular a mdia

Estrutura de Dados II - Mrcio Bueno 6

Classificao por Troca - Quicksort Escolha do Piv

Por questes de simplicidade, vamos escolher a chave que se encontra na posio inicial do vetor para ser a particionadora.

Estrutura de Dados II - Mrcio Bueno 7

Classificao por Troca - Quicksort

elementos < pivelementos > piv

esquerdapiv

direitaiptr

Elementos no examinadoselementos < pivelementos > piv

esquerdapiv

direitaiptr

Elementos no examinados

Estrutura de Dados II - Mrcio Bueno 8

Classificao por Troca - Quicksortint particiona( int A[ ], int esquerda, int direita ){ int i, temp;int ptr = esquerda;int pivo = A[esquerda]; /* piv primeiro elemento */

/* Separa o vetor em elementos pequenos e grandes em relao ao piv */

for (i = esquerda+1; i

Estrutura de Dados II - Mrcio Bueno 9

Classificao por Troca - Quicksortvoid troca(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;

}

Estrutura de Dados II - Mrcio Bueno 10

Classificao por Troca - Quicksort

26 33 35 29 12 1922

ptr i

i=1

26 33 35 29 12 1922

ptr i

i=2

26 33 35 29 12 1922

ptr i

i=3

26 12 35 29 33 1922

ptr i

i=4

26 12 22 29 33 1935

ptr i

i=5

26 12 22 19 33 2935

ptr i

i=6

26 33 35 29 12 1922

ptr

Particiona( A,0,6 )

19 12 22 26 33 2935

return ptr

26 33 35 29 12 1922

ptr i

i=1

26 33 35 29 12 1922

ptr i

i=2

26 33 35 29 12 1922

ptr i

i=3

26 12 35 29 33 1922

ptr i

i=4

26 12 22 29 33 1935

ptr i

i=5

26 12 22 19 33 2935

ptr i

i=6

26 33 35 29 12 1922

ptr

Particiona( A,0,6 )

19 12 22 26 33 2935

return ptr

11

Seleciona 26 como piv

Mistura

Piv no [3]

26 33 35 29 12 1922

0 1 2 3 4 65

19 12 22 26 33 2935

Seleciona 19 como piv Mistura Piv no [1]

12

0

19

1

22

2

Fim

Seleciona 33 como piv Mistura Piv no[5]

29

4

33

5

35

6

QS(A,0,2) QS(A,4,6)

Fim Fim

QS(A,0,6)

QS(A,2,2)QS(A,0,0) QS(A,4,4) QS(A,6,6)

0 1 2 3 4 65

Lista inicial A:

FimEstrutura de Dados II - Mrcio Bueno

Estrutura de Dados II - Mrcio Bueno 12

Classificao por Troca - Quicksortvoid quickSort( int A[ ], int esquerda, int direita )

{

int pivo = particiona (A, esquerda, direita);

if ( pivo > esquerda)

quickSort( A, esquerda, pivo - 1 );

if ( pivo < direita)

quickSort( A, pivo + 1, direita );

}

Estrutura de Dados II - Mrcio Bueno 13

Classificao por Troca - Quicksort Comparado com os demais mtodos o que apresenta, em

mdia, o menor tempo de classificao. Tem um desempenho logartmico - O(n log2n) o que apresenta o menor nmero de operaes

elementares. As razes porque quicksort mais eficiente que o problema de diviso executado no mesmo

vetor e muito eficientementeNo precisa copiar o vetor ordenado

Para vetores muito pequenos (N

Estrutura de Dados II - Mrcio Bueno 14

Classificao por Troca - QuickSort

ExercciosMostre o passo a passo de executar quicksort

para o seguinte conjunto de dados {9, 25, 10, 18, 5, 7, 15, 3}, usando o primeiro elemento como piv.

Faa o mesmo para esse conjunto de dados {8, 5, 4, 7, 6, 1, 6, 3, 8, 12, 10}.

Estrutura de Dados II - Mrcio Bueno 15

O Mtodo da Seleo em rvore Heapsort Inventado por John Williams (1964) e usa a

abordagem inerente ordenao por seleo.

O mtodo utiliza a seleo em rvore para a obtenodos elementos do vetor na ordem desejada.

Ele consiste em duas fases distintas:

1) Primeiro montada uma rvore binria (heap)contendo todos os elementos do vetor, de talforma que o valor contido em qualquer n sejamaior do que os valores de seus filhos;

2) Em seguida, o heap usado para a seleo doselementos na ordem desejada.

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 16

Mtodo Heapsort - Descrio do Algoritmo

Dado um vetor de chaves C1, C2, ..., CN,consideramos este vetor como sendo arepresentao de uma rvore binria, usandoa seguinte interpretao dos ndices daschaves:C1 a raiz da rvore;

C2i = subrvore da esquerda de CiC2i+1 = subrvore da direita de Ci

Para i = 1, ..., N div 2

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 17

Mtodo Heapsort - Descrio do Algoritmo

Exemplificando: dado um vetor V1..7, eutilizando a interpretao dada, podemosv-lo como sendo a representao daseguinte rvore binria:

C1

C2 C3

C4 C5 C6 C7

Para i = 1 at 7 div 2 = 1 .. 3

i = 1 -> Pai C1 e Filhos: C2 e C3

i = 2 -> Pai C2 e Filhos: C4 e C5

i = 3 -> Pai C3 e Filhos: C6 e C7

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 18

Mtodo Heapsort - Descrio do AlgoritmoO passo seguinte consiste em trocar as chaves de

posio dentro do vetor, de tal forma que estas passema formar uma hierarquia, na qual todas as razes dassubrvores sejam maiores ou iguais a qualquer uma dassuas sucessoras, ou seja, cada raiz deve satisfazer asseguintes condies:

Ci C2i Ci C2i + 1 Para i = 1, ..., N div 2.

Quando todas as razes das subrvores satisfazem essas condies, dizemos que a rvore forma um heap.

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 19

Mtodo Heapsort - Descrio do Algoritmo

O processo de troca de posies daschaves no vetor, de forma que a rvorerepresentada passe a ser um heap, podeser feito testando-se cada uma dassubrvores para verificar se elas,separadamente, satisfazem a condio deheap.

Apenas as rvores que possuem pelo menosum sucessor devem ser testada.

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 20

Mtodo Heapsort - Descrio do Algoritmo

A maneira mais simples de realizar o teste iniciando pela ltima subrvore, ou seja,aquela cuja raiz est na posio N div 2 dovetor de chaves, prosseguindo, a partirda, para as subrvores que a antecedem,at chegar raiz da rvore.

No exemplo, a primeira subrvore a sertestada aquela cuja raiz C3, depois a deraiz C2 e finalizando com a de raiz C1.

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 21

Mtodo Heapsort - Descrio do AlgoritmoSempre que for encontrada uma subrvore que no

forme um heap, seus componentes devem serrearranjados de modo a formar o heap.

10

05 12

12

05 10

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 22

Mtodo Heapsort - Descrio do AlgoritmoPode ocorrer tambm que, ao rearranjarmos uma

subrvore, isto venha a afetar outra, do nvelimediatamente inferior, fazendo que esta deixede formar um heap.

Esta possibilidade obriga a verificar, sempre quefor rearranjada uma subrvore, se a sucessora donvel abaixo no teve a sua condio de heapdesfeita.

Classificao por Seleo - Heapsort

Estrutura de Dados II - Mrcio Bueno 23

Mtodo Heapsort - Exemplo

Objetivo: Seleo da maior chave

Vetor inicial: 12 09 13 25 18 10 22

Representao em rvore:12

09 13