40
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da profa. Patrícia Jaques

Programação II

  • Upload
    neron

  • View
    25

  • Download
    0

Embed Size (px)

DESCRIPTION

Programação II. Prof. Mateus Raeder. Transparências baseadas nos originais da profa. Patrícia Jaques. Universidade do Vale do Rio dos Sinos - São Leopoldo -. Classificação de Dados. Classificação. Processo de organizar itens em ordem (de)crescente, segundo algum critério - PowerPoint PPT Presentation

Citation preview

Page 1: Programação II

Programação II

Prof. Mateus Raeder

Universidade do Vale do Rio dos Sinos- São Leopoldo -

Transparências baseadas nos originais da profa. Patrícia Jaques

Page 2: Programação II

Programação II – Prof. Mateus Raeder

Classificação de Dados

Page 3: Programação II

Programação II – Prof. Mateus Raeder

• Processo de organizar itens em ordem (de)crescente, segundo algum critério

• Também chamado de ordenação

• Aplicações de Sorting– Preparação de dados para facilitar pesquisas futuras

• Exemplo: dicionários e listas telefônicas– Agrupar itens que apresentam mesmos valores

• Para eliminação de elementos repetidos– Batimento entre itens presentes em mais de um arquivo

• Para combinação de dados presentes nos vários arquivos• Para consolidação dos vários arquivos em um único

Classificação

Page 4: Programação II

Programação II – Prof. Mateus Raeder

• Sejam R1, R2, …, RN , N ítens (chamados registros)

• Cada registro Ri, é formado por uma chave Ci e por informações ditas satélites

• A ordenação dos registros é feita definindo-se uma relação de ordem “<“ sobre os valores das chaves

• O objetivo da ordenação é determinar uma permutação dos índices 1 i1, i2, …, iN N das chaves, tal que Ci1 Ci2 … CiN.

• Um conjunto de registros é chamado de arquivo

Definições

Page 5: Programação II

Programação II – Prof. Mateus Raeder

• Uma relação de ordem “<“ (leia-se precede) deve satisfazer as seguintes condições para quaisquer valores a, b e c:

(i) Uma e somente uma das seguintes possibilidades é verdadeira: a < b, a = b ou b < a (lei da tricotomia)

(ii) Se a < b e b < c, então a < c (transitividade)

• As propriedades (i) e (ii) definem o conceito de ordem linear ou ordem total

Relação de Ordem

Page 6: Programação II

Programação II – Prof. Mateus Raeder

• Escreva um algoritmo para classificar um conjunto de 5 números em ordem crescente.

Exercício

Page 7: Programação II

Programação II – Prof. Mateus Raeder

– Reorganização Física

– Encadeamento

– Vetor Indireto de Ordenação (VIO)

Formas de Representação do Resultado

Page 8: Programação II

Programação II – Prof. Mateus Raeder

10

19

13

12

7

1

2

3

4

5

chave

(a) antes da classificação

7

10

12

13

19

1

2

3

4

5

chave

(b) após a classificação

Reorganização Física

Page 9: Programação II

Programação II – Prof. Mateus Raeder

10

19

13

12

7

1

2

3

4

5

chave

(a) antes da classificação (b) após a classificação

10

19

13

12

7

1

2

3

4

5

chave

4

0

2

3

1

5

cabeça da listaEncadeamento

Page 10: Programação II

Programação II – Prof. Mateus Raeder

10

19

13

12

7

1

2

3

4

5

Chave Chave VIO

1

2

3

4

5

5

1

4

3

2

7

10

12

13

19

Vetor Indireto de Ordenação

Page 11: Programação II

Programação II – Prof. Mateus Raeder

– Classificação por Inserção

• Inserção Direta

• ShellSort

– Classificação por Trocas (permutação)

• BubbleSort

• QuickSort

– Classificação por Seleção

• Seleção Direta

• HeapSort

Métodos de Classificação

Page 12: Programação II

Programação II – Prof. Mateus Raeder

• A classificação é obtida porque os elementos são inseridos na sua posição correta.

• Algoritmos:– Inserção Direta– ShellSort

Classificação por Inserção

Page 13: Programação II

Programação II – Prof. Mateus Raeder

Inserção Direta• Mais simples

• Normalmente utilizado para um conjunto pequeno de dados, pois apresenta baixa eficiência

• Divide o vetor em 2 segmentos:– o primeiro contendo os elementos já ordenados– o segundo contendo os elementos ainda não ordenados

• Funcionamento: Pega o primeiro elemento do segmento não ordenado e procura seu lugar no segmento ordenado.

• No início: o 1º segmento terá apenas 1 elemento

Page 14: Programação II

Programação II – Prof. Mateus Raeder

18 15 7 9 23 16 14

18 15 7 9 23 16 14

15 18 7 9 23 16 14

7 15 18 9 23 16 14

Vetor original

Divisão inicial

Não ordenado

Ordenado

...

Primeira iteração

Segunda iteração

Inserção Direta

Page 15: Programação II

Programação II – Prof. Mateus Raeder

public static void insertionSort (int a[]) { for (int i = 1; i < a.length; i++) {

int j = i; // pos do 1º elemento no seg. não ord. int B = a[i]; // 1º elemento no seg. não ord. while ((j > 0) && (a[j-1] > B)) {

a[j] = a[j-1]; j--;

}a[j] = B;

} } // do método

18 15 7 9 23 16 14

0 1 2 3 4 5 6

buscando a posiçãodo 1º elemento do segmento não ordenado no segmento ordenado

Inserção Direta

Page 16: Programação II

Programação II – Prof. Mateus Raeder

• Proposto por Ronald Shell em 1959.

• Explora as seguintes características do método de inserção direta:– desempenho aceitável quando o número de chaves é pequeno;– desempenho aceitável quando as chaves já possuem uma ordenação

parcial.

• É considerado uma extensão do método de inserção direta, pois se diferencia deste apenas no nro. de segmentos considerados.

• Realiza classificações parciais do vetor a cada iteração, favorecendo o desempenho dos passos seguintes.

ShellSort

Page 17: Programação II

Programação II – Prof. Mateus Raeder

• Método de classificação:– No primeiro passo, o vetor C [ n ] é dividido em h

segmentos, de tal forma que cada um possua n / h chaves

– Cada um dos segmentos é classificado por inserção direta, separadamente

– No passo seguinte, o incremento h é diminuído (a metade do valor anterior, se este era potência inteira de 2) incrementos decrescente

– No último passo, h = 1 h=22=4h=21=2h=20=1

3 passos

ShellSort

Page 18: Programação II

Programação II – Prof. Mateus Raeder

• Testes empíricos sugerem que a melhor escolha para os valores de h é a sequência

• <(3t-1)/2, ..., 13, 4, 1> onde

• ht = 3ht-1+1– 3*0+1 = 1– 3*1+1 = 4– 3*4+1 = 13– 3*13+1 = 40

ShellSort

Page 19: Programação II

Programação II – Prof. Mateus Raeder

17 25 49 12 18 23 45 38 53 42 27 13 11

0 1 2 3 4 5 6 7 8 9 10 11 12

Original

1 2 3 4 1 2 3 4 1 2 3 4 1

0 1 2 3 4 5 6 7 8 9 10 11 12

Primeiro passo: h = 411 23 27 12 17 25 45 13 18 42 49 45 53

11 12 13 17 18 23 25 27 38 42 45 49 53

0 1 2 3 4 5 6 7 8 9 10 11 12

Último passo: h=1

ShellSort

Page 20: Programação II

Programação II – Prof. Mateus Raeder

public static void shellSort(int a[]) { int h = 1; // acha o maior valor possível para h while ((h * 3 + 1) < a.length) h = 3 * h + 1; // h=4 while( h > 0 ) { // para cada segmento de elem. (há h segm.) for (int i = h; i < a.length; i++) { int B = a[i]; int j = i;

// compara B com o elemento antes dele no conjunto //e assim por diante até achar o lugar de B while ((j >= h) && (a[j - h] > B)) { a[j] = a[j - h]; j -= h; } a[j] = B; } h = h / 3; } }

ShellSort

1 2 3 4 1 2 3 4 1 2 3 4 1

0 1 2 3 4 5 6 7 8 9 10 11 12

11 23 27 12 17 25 45 13 18 42 49 45 53

Page 21: Programação II

Programação II – Prof. Mateus Raeder

• Caracterizam-se por efetuarem a classificação por comparação entre pares de chaves, trocando-as de posição caso estejam fora de ordem no par.

• Algoritmos:– BubbleSort

– QuickSort

Classificação por Trocas

Page 22: Programação II

Programação II – Prof. Mateus Raeder

Primeira Varredura

28 26 30 24 25 compara par (28, 26) : troca

26 28 30 24 25 compara par (28, 30) : não troca

26 28 30 24 25 compara par (30, 24) : troca

26 28 24 30 25 compara par (30, 25) : troca

26 28 24 25 30 fim da primeira varredura

Exemplo: Suponha que se deseja classificar em ordem crescente o seguinte vetor de chaves:

28 26 30 24 25

Método da Bolha (BubbleSort)

Page 23: Programação II

Programação II – Prof. Mateus Raeder

Segunda Varredura

26 28 24 25 30 compara par (26, 28) : não troca

26 28 24 25 30 compara par (28, 24) : troca

26 24 28 25 30 compara par (28, 25) : troca

26 24 25 28 30 fim da segunda varredura

26 24 25 28 30 compara par (26, 24) : troca

24 26 25 28 30 compara par (26, 25) : troca

24 25 26 28 30 fim da terceira varredura

Terceira Varredura

Método da Bolha (BubbleSort)

Page 24: Programação II

Programação II – Prof. Mateus Raeder

public static void bubbleSort(int a[]) { for (int i = a.length-1; i>0; i--) { // nro de

varredurasfor (int j = 0; j<i; j++) { // percorre vetor

if (a[j] > a[j+1]) { // troca par de posição

int T = a[j]; a[j] = a[j+1]; a[j+1] = T;

}}

}}

Método da Bolha (BubbleSort)

Page 25: Programação II

Programação II – Prof. Mateus Raeder

Método da Bolha (BubbleSort)

Considerando o seguinte vetor :

13 11 25 10 18 21 23

1) Em quantas varreduras o vetor é classificado ?

2) Como identificar, a partir da última varredura, quantas chaves já estão classificadas?

Page 26: Programação II

Programação II – Prof. Mateus Raeder

Considerando o seguinte vetor :

13 11 25 10 18 21 23

1) Em quantas varreduras o vetor é classificado ?

2) Como identificar, a partir da última varredura, quantas chaves já estão classificadas?

Observe que a quantidade de chaves, a partir da última, que pode ser ignorada de uma varredura para a outra é conhecida pela posição na qual ocorreu a última troca.A partir daquele ponto o vetor já se encontra classificado!

Método da Bolha (BubbleSort)

Page 27: Programação II

Programação II – Prof. Mateus Raeder

public static void bubbleSort(int a[]) { for (int i = a.length-1; i>0; i--) { // nro. de

varreduras boolean flipped = false;for (int j = 0; j<i; j++) {

if (a[j] > a[j+1]) { // troca par de posição

int T = a[j]; a[j] = a[j+1]; a[j+1] = T; flipped = true;

} }if (!flipped) return;

}}

Método da Bolha (BubbleSort)Uma melhoria no algoritmo, para parar caso já esteja ordenado:

Page 28: Programação II

Programação II – Prof. Mateus Raeder

• Análise do Desempenho do melhor caso– aquele no qual as chaves já se encontram na ordem desejada

– na primeira varredura o método já terá descoberto que o vetor já se encontra ordenado

– número de comparações efetuadas ?• n-1

• Análise do desempenho do pior caso– chaves do vetor se encontram na ordem inversa a desejada

– a cada varredura apenas uma chave será colocada no seu lugar definitivo; as demais se deslocarão uma posição para a esquerda (em ordenação crescente)

Método da Bolha (BubbleSort)

Page 29: Programação II

Programação II – Prof. Mateus Raeder

A idéia básica é a de dividir o problema, de ordenarum conjunto de n itens em dois problemas menores.

A seguir, os problemas menores são ordenadosindependentemente e depois os resultados são combinados

para produzir a solução do problema maior!

(Ziviani, 1996)

Método QuickSort

Page 30: Programação II

Programação II – Prof. Mateus Raeder

QuickSort

• 1) Dividir– Escolher um elemento da array como pivô (x);– Particionar:

• elementos < pivô primeira parte• elementos > pivô segunda parte

Page 31: Programação II

Programação II – Prof. Mateus Raeder

• Princípio de classificação– inicialmente, o vetor de chaves C é particionado em três

segmentos S1, S2 e S3

– S2 terá comprimento 1 e conterá uma chave denominada particionadora ou pivô

– S1 terá comprimento 0 e conterá todas as chaves cujos valores são menores ou iguais ao da chave particionadora. Esse segmento está posicionado à esquerda de S2

– S3 terá comprimento 0 e conterá todas as chaves cujos valores são maiores do que o da chave particionadora. Esse segmento está posicionado à direita de S2

QuickSort

Page 32: Programação II

Programação II – Prof. Mateus Raeder

Vetor Inicial : C [ 1 .. n ]

1 n

Vetor Particionado1 n

S1 S2 S3

K - 1 k K + 1

Onde: C [ i ] C [ k ] , para i = 1, … , k - 1C [ i ] > C [ k ] , para i = k + 1 , … , n

QuickSort

Page 33: Programação II

Programação II – Prof. Mateus Raeder

• Princípio de classificação (continuação … )– o processo de particionamento é reaplicado aos

segmentos S1 e S2 e a todos os segmentos correspondentes daí resultantes, que tiverem comprimento 1

– quando não restarem segmentos a serem particionados, o vetor estará ordenado

– qual é a chave particionadora ideal ? Como escolher essa chave ?

QuickSort

Page 34: Programação II

Programação II – Prof. Mateus Raeder

• Escolhendo a chave particionadora ...– para simplificar o algoritmo de particionamento,

pode-se arbitrar que a chave que se encontra na posição inicial do vetor a ser particionado será a particionadora

– se existe conhecimento prévio sobre a distribuição dos valores das chaves e o vetor já se encontra parcialmente ordenado, a chave que se encontra na posição central do vetor pode ser a eleita

QuickSort

Page 35: Programação II

Programação II – Prof. Mateus Raeder

public static void quickSort (int[] a, int lo, int hi){ int i=lo, j=hi, h; int x=a[(lo+hi)/2]; // partition do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j); // recursion if (lo<j) quickSort(a, lo, j); if (i<hi) quickSort(a, i, hi); }

QuickSort

Page 36: Programação II

Programação II – Prof. Mateus Raeder

Quick Sortvoid quicksort (int[] a, int lo, int hi){ int i=lo, j=hi, h; int x=a[(lo+hi)/2];

// partition do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j);

// recursion if (lo<j) quicksort(a, lo, j); if (i<hi) quicksort(a, i, hi);}

lo x=a[4] hi

i j

0 1 2 3 4 5 6 7 8 9

quicksort(a, 0, a.length-1)

i ji j

i j 0 1 2 3 4 5 6 7 8 9

0 1 2 3 4 5 6 7 8 9

i j 0 1 2 3 4 5 6 7 8 9

ij

quicksort(a, 0, 3)

quicksort(a, 5, 9)

Page 37: Programação II

Programação II – Prof. Mateus Raeder

Quick Sortvoid quicksort (int[] a, int lo, int hi){ int i=lo, j=hi, h; int x=a[(lo+hi)/2];

// partition do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j);

// recursion if (lo<j) quicksort(a, lo, j); if (i<hi) quicksort(a, i, hi);}

lox=a[1]hi

0 1 2 3 4 5 6 7 8 9

i j

quicksort(a, 0, 0)

quicksort(a, 2, 3)

lo hix=a[7]

i jj

ij

0 1 2 3

i i i j

ij i

quicksort(a, 5, 8)

0 1 2 3 4 5 6 7 8 9

Page 38: Programação II

Programação II – Prof. Mateus Raeder

Quick Sortvoid quicksort (int[] a, int lo, int hi){ int i=lo, j=hi, h; int x=a[(lo+hi)/2];

// partition do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j);

// recursion if (lo<j) quicksort(a, lo, j); if (i<hi) quicksort(a, i, hi);}

0 1 2 3 4 5 6 7 8 9

lo hix=a[6]

i j 0 1 2 3 4 5 6 7 8 9

i j

quicksort(a, 5, 6)

lo hi

x=a[2]

i

ij ij

j

j i

Page 39: Programação II

Programação II – Prof. Mateus Raeder

Exercício:

Suponha que se deseja classificar o seguinte vetor:

G R E M I S T A

Suponha que a chave particionadora está na posiçãono meio do vetor.

Simule as iterações necessárias para a classificação,segundo o algoritmo apresentado.

Quick Sort

Page 40: Programação II

Programação II – Prof. Mateus Raeder

• Caracterizam-se por procurarem, a cada iteração, a chave de menor (ou maior) valor do vetor e colocá-la na sua posição definitiva correta, qual seja, no início (ou no final) do vetor, por permutação com a que ocupa aquela posição!

• Algoritmos:– Seleção Direta

– HeapSort

Classificação por Seleção