Classificao Mtodos de Classificao Os mtodos de classificao

  • Slides: 77
Download presentation
Classificação

Classificação

Métodos de Classificação Os métodos de classificação podem ser dos tipos: n Classificação interna

Métodos de Classificação Os métodos de classificação podem ser dos tipos: n Classificação interna – quando toda a coleção de itens a classificar pode ficar armazenada em um “array” em memória n Classificação externa – quando as coleções de itens são muito grandes para poder permanecer armazenadas em memória 2

Regiões classificada e não classificada Os métodos são iterativos e nos “arrays” de registros

Regiões classificada e não classificada Os métodos são iterativos e nos “arrays” de registros aparecem duas regiões: a região já classificada e a região de registros ainda não classificados. Em cada iteração vai crescendo a região classificada. O processo se encerra quando a região classificada abrange todo o “array”. 3

Métodos mais conhecidos Os métodos mais conhecidos são: n Classificação por troca n Classificação

Métodos mais conhecidos Os métodos mais conhecidos são: n Classificação por troca n Classificação por seleção n Classificação por inserção 4

Classificação por troca Na classificação por troca comparam-se dois elementos do “array” verificando se

Classificação por troca Na classificação por troca comparam-se dois elementos do “array” verificando se a posição relativa do antecessor e do sucessor obedecem ao critério de classificação especificado. Caso haja obediência ao critério de classificação nada é feito. Em caso contrário trocam-se as posições destes registros. Exemplos: n Bubble Sort n Shake Sort n Quick Sort 5

Classificação por Inserção Na classificação por inserção em cada instante toma-se um elemento, o

Classificação por Inserção Na classificação por inserção em cada instante toma-se um elemento, o elemento corrente, do trecho ainda não classificado do “array” e faz-se a inserção deste elemento na posição correta do trecho já classificado. Em conseqüência reduz-se o trecho ainda não classificado e amplia-se o trecho já classificado. Exemplos: n Inserção Simples n Shell Sort 6

Exemplo de Inserção Simples 7

Exemplo de Inserção Simples 7

Exemplo de Inserção Simples 8

Exemplo de Inserção Simples 8

Exemplo de Inserção Simples 9

Exemplo de Inserção Simples 9

Exemplo de Inserção Simples 10

Exemplo de Inserção Simples 10

Exemplo de Inserção Simples 11

Exemplo de Inserção Simples 11

Exemplo de Inserção Simples 12

Exemplo de Inserção Simples 12

Exemplo de Inserção Simples 13

Exemplo de Inserção Simples 13

Exemplo de Inserção Simples 14

Exemplo de Inserção Simples 14

Exemplo de Inserção Simples 15

Exemplo de Inserção Simples 15

Exemplo de Inserção Simples 16

Exemplo de Inserção Simples 16

Exemplo de Inserção Simples 17

Exemplo de Inserção Simples 17

Exemplo de Inserção Simples 18

Exemplo de Inserção Simples 18

Classificação por Seleção Na classificação por seleção, em cada instante seleciona-se do trecho ainda

Classificação por Seleção Na classificação por seleção, em cada instante seleciona-se do trecho ainda não classificado o elemento mais apropriado para ser acrescentado ao trecho já classificado. Em conseqüência reduz-se o trecho ainda não classificado e amplia-se o trecho já classificado. Exemplos: n Seleção Direta n Heap Sort 19

Exemplo de Seleção Direta 20

Exemplo de Seleção Direta 20

Exemplo de Seleção Direta 21

Exemplo de Seleção Direta 21

Exemplo de Seleção Direta 22

Exemplo de Seleção Direta 22

Exemplo de Seleção Direta 23

Exemplo de Seleção Direta 23

Exemplo de Seleção Direta 24

Exemplo de Seleção Direta 24

Exemplo de Seleção Direta 25

Exemplo de Seleção Direta 25

Exemplo de Seleção Direta 26

Exemplo de Seleção Direta 26

Exemplo de Seleção Direta 27

Exemplo de Seleção Direta 27

Exemplo de Seleção Direta 28

Exemplo de Seleção Direta 28

Exemplo de Seleção Direta 29

Exemplo de Seleção Direta 29

Exemplo de Seleção Direta 30

Exemplo de Seleção Direta 30

Exemplo de Seleção Direta 31

Exemplo de Seleção Direta 31

Exemplo de Quick Sort (1) 32

Exemplo de Quick Sort (1) 32

Exemplo de Quick Sort (2) 33

Exemplo de Quick Sort (2) 33

Exemplo de “Shell Sort” (1) 34

Exemplo de “Shell Sort” (1) 34

Exemplo de “Shell Sort” (2) 35

Exemplo de “Shell Sort” (2) 35

Exemplo de “Shell Sort” (3) 36

Exemplo de “Shell Sort” (3) 36

Critérios de Opção Sugestão Uma regra simples, que deve ser reavaliada em casos mais

Critérios de Opção Sugestão Uma regra simples, que deve ser reavaliada em casos mais sensíveis, consiste em se utilizar: n Inserção simples para “arrays” com até 30 registros; n “Quick Sort” para “arrays” com mais de 30 registros. 37

Hierarquia de classes para a classificação interna 38

Hierarquia de classes para a classificação interna 38

Interface Sorter // pgm 15_01. java public interface Sorter { void sort (Comparable[]array); }

Interface Sorter // pgm 15_01. java public interface Sorter { void sort (Comparable[]array); } 39

A Classe Abstrata Abstract. Sorter (1) // pgm 15_02. java public abstract class Abstract.

A Classe Abstrata Abstract. Sorter (1) // pgm 15_02. java public abstract class Abstract. Sorter implements Sorter { protected Comparable[] array; protected int n; protected abstract void sort(); 40

A Classe Abstrata Abstract. Sorter (2) public final void sort (Comparable[] array) { n

A Classe Abstrata Abstract. Sorter (2) public final void sort (Comparable[] array) { n = array. length; this. array = array; if(n > 0) sort(); this. array = null; } protected final { Comparable array[i] = array[j] = } void swap(int i, int j) tmp = array[i]; array[j]; tmp; } 41

Insertion Sorting 42

Insertion Sorting 42

A Classe Straight. Insertion. Sorter // pgm 15_03. java public class Straight. Insertion. Sorter

A Classe Straight. Insertion. Sorter // pgm 15_03. java public class Straight. Insertion. Sorter extends Abstract. Sorter { protected void sort() { for(int i = 1; i < n; ++i) for(int j = i; j > 0 && array[j - 1]. is. GT (array [j]); --j) { swap(j, j - 1); } } } 43

A Classe Binary. Insertion. Sorter (1) // pgm 15_04. java public class Binary. Insertion.

A Classe Binary. Insertion. Sorter (1) // pgm 15_04. java public class Binary. Insertion. Sorter extends Abstract. Sorter { protected void sort() { for(int i = 1; i < n; ++i) { Comparable tmp = array[i]; int left = 0; int right = i; 44

A Classe Binary. Insertion. Sorter (2) while(left < right) { int middle = (left

A Classe Binary. Insertion. Sorter (2) while(left < right) { int middle = (left + right) / 2; if(tmp. is. GE(array[middle])) left = middle + 1; else right = middle; } for(int j = i; j > left; --j) swap (j - 1, j); } } } 45

Bublesort 46

Bublesort 46

A Classe Bubble. Sorter // pgm 15_05. java public class Bubble. Sorter extends Abstract.

A Classe Bubble. Sorter // pgm 15_05. java public class Bubble. Sorter extends Abstract. Sorter { protected void sort() { for(int i = n; i > 1; --i) for(int j = 0; j < i - 1; ++j) if(array[j]. is. GT(array[j + 1])) swap(j, j + 1); } } 47

Quick. Sort 48

Quick. Sort 48

A Classe Abstrata Abstract. Quick. Sorter (1) // pgm 15_06. java public abstract class

A Classe Abstrata Abstract. Quick. Sorter (1) // pgm 15_06. java public abstract class Abstract. Quick. Sorter extends Abstract. Sorter { protected static final int cut. Off = 2; // minimum cut-off protected abstract int select. Pivot(int left, int right); //. . . } 49

A Classe Abstrata Abstract. Quick. Sorter (2) // pgm 15_07. java public abstract class

A Classe Abstrata Abstract. Quick. Sorter (2) // pgm 15_07. java public abstract class Abstract. Quick. Sorter extends Abstract. Sorter { protected void sort(int left, int right) { if(right - left + 1 > cut. Off) { int p = select. Pivot(left, right); swap(p, right); Comparable pivot = array[right]; int i = left; int j = right - 1; 50

A Classe Abstrata Abstract. Quick. Sorter (3) for(; ; ) { while(i < j

A Classe Abstrata Abstract. Quick. Sorter (3) for(; ; ) { while(i < j && array[i]. is. LT(pivot)) while(i < j && array[j]. is. GT(pivot)) if(i >= j) break; ++i; --j; swap(i++, j--); } if(array[i]. is. GT(pivot)) swap(i, right); if(left < i) sort(left, i - 1); if(right > i) sort(i + 1, right); } } //. . . } 51

A Classe Abstrata Abstract. Quick. Sorter (4) // pgm 15_08. java public abstract class

A Classe Abstrata Abstract. Quick. Sorter (4) // pgm 15_08. java public abstract class Abstract. Quick. Sorter extends Abstract. Sorter { protected void sort() { sort(0, n - 1); Sorter sorter = new Straight. Insertion. Sorter(); sorter. sort(array); } //. . . } 52

A Classe Median. Of. Three. Quick. Sorter // pgm 15_09. java public class Median.

A Classe Median. Of. Three. Quick. Sorter // pgm 15_09. java public class Median. Of. Three. Quick. Sorter extends Abstract. Quick. Sorter { protected int select. Pivot(int left, int right) { int middle = (left + right) / 2; if (array[left]. is. GT(array[middle])) swap(left, middle); if(array[left]. is. GT(array[right])) swap(left, right); if(array[middle]. is. GT(array[right])) swap(middle, right); return middle; } } 53

Straight. Selection. Sort 54

Straight. Selection. Sort 54

A Classe Straight. Selection. Sorter // pgm 15_10. java public class Straight. Selection. Sorter

A Classe Straight. Selection. Sorter // pgm 15_10. java public class Straight. Selection. Sorter extends Abstract. Sorter { protected void sort() { for(int i = n; i > 1; --i) { int max = 0; for(int j = 1; j < i; ++j) if(array[j]. is. GT(array[max])) max = j; swap(i - 1, max); } } } 55

Heap. Sort 56

Heap. Sort 56

Construção de um Heap 57

Construção de um Heap 57

Heap Sorting 58

Heap Sorting 58

A classe Heap. Sorter (1) // pgm 15_11. java public class Heap. Sorter extends

A classe Heap. Sorter (1) // pgm 15_11. java public class Heap. Sorter extends Abstract. Sorter { protected static final int base = 1; protected void percolate. Down(int i, int length) { while(2 * i <= length) { int j = 2 * i; if( j < length && array[j + 1 - base]. is. GT(array[j - base]) ) 59

A classe Heap. Sorter (2) j = j + 1; if(array[i - base]. is.

A classe Heap. Sorter (2) j = j + 1; if(array[i - base]. is. GE(array[j - base])) break; swap(i - base, j - base); i = j; } } //. . . } 60

A classe Heap. Sorter (3) // pgm 15_12. java public class Heap. Sorter extends

A classe Heap. Sorter (3) // pgm 15_12. java public class Heap. Sorter extends Abstract. Sorter { protected static final int base = 1; protected void build. Heap() { for(int i = n / 2; i > 0; --i) percolate. Down (i, n); } //. . . } 61

A classe Heap. Sorter (4) // pgm 15_13. java public class Heap. Sorter extends

A classe Heap. Sorter (4) // pgm 15_13. java public class Heap. Sorter extends Abstract. Sorter { protected static final int base = 1; protected void sort() { build. Heap(); for(int i = n; i >= 2; --i) { swap(i - base, 1 - base); percolate. Down(1, i - 1); } } //. . . } 62

Two Way Merging 63

Two Way Merging 63

Two Way Merge Sorting 64

Two Way Merge Sorting 64

A classe Two. Way. Merge. Sorter (1) // pgm 15_14. java public class Two.

A classe Two. Way. Merge. Sorter (1) // pgm 15_14. java public class Two. Way. Merge. Sorter extends Abstract. Sorter { Comparable[] temp. Array; //. . . } 65

A classe Two. Way. Merge. Sorter (2) // pgm 15_15. java public class Two.

A classe Two. Way. Merge. Sorter (2) // pgm 15_15. java public class Two. Way. Merge. Sorter extends Abstract. Sorter { Comparable[] temp. Array; protected void merge(int left, int middle, int right) { int i = left; int j = left; int k = middle + 1; 66

A classe Two. Way. Merge. Sorter (3) while(j <= middle && k <= right)

A classe Two. Way. Merge. Sorter (3) while(j <= middle && k <= right) { if(array[j]. is. LT(array[k])) temp. Array[i++] = array[j++]; else temp. Array[i++] = array[k++]; } while(j <= middle) temp. Array[i++] = array[j++]; for(i = left; i < k; ++i) array[i] = temp. Array[i]; } //. . . } 67

A classe Two. Way. Merge. Sorter (4) // pgm 15_16. java public class Two.

A classe Two. Way. Merge. Sorter (4) // pgm 15_16. java public class Two. Way. Merge. Sorter extends Abstract. Sorter { Comparable[] temp. Array; protected void { temp. Array sort(0, n temp. Array } sort() = new Comparable[n]; - 1); = null; 68

A classe Two. Way. Merge. Sorter (5) protected void sort (int left, int right)

A classe Two. Way. Merge. Sorter (5) protected void sort (int left, int right) { if(left < right) { int middle = (left + right) / 2; sort(left, middle); sort(middle + 1, right); merge(left, middle, right); } } //. . . } 69

Bucket Sorting 70

Bucket Sorting 70

A classe Bucket. Sorter (1) // pgm 15_17. java public class Bucket. Sorter extends

A classe Bucket. Sorter (1) // pgm 15_17. java public class Bucket. Sorter extends Abstract. Sorter { protected int m; protected int[] count; public Bucket. Sorter(int m) { this. m = m; count = new int [m]; } protected void sort() { sort((Int[]) array); } //. . . } 71

A classe Bucket. Sorter (2) // pgm 15_18. java public class Bucket. Sorter extends

A classe Bucket. Sorter (2) // pgm 15_18. java public class Bucket. Sorter extends Abstract. Sorter { protected int m; protected int[] count; protected void sort(Int[] array) { for(int i = 0; i < m; ++i) count[i] = 0; for(int j = 0; j < n; ++j) ++count[array[j]. int. Value()]; for(int i = 0, j = 0; i < m; ++i) for( ; count[i] > 0; --count[i]) array[j++] = new Int(i); } //. . . } 72

Radix Sorting 73

Radix Sorting 73

A classe Radix. Sorter (1) // pgm 15_19. java public class Radix. Sorter extends

A classe Radix. Sorter (1) // pgm 15_19. java public class Radix. Sorter extends Abstract. Sorter { protected static final int r = 8; // bits da raiz protected static final int R = 1 << r; // Raiz protected static final int p = (32 + r - 1) / r; // Int com 32 bits // p número de passagens para varrer um Int protected int[] count = new int [R]; protected void sort() { sort ((Int[]) array); } //. . . } 74

A classe Radix. Sorter (2) // pgm 15_20. java public class Radix. Sorter extends

A classe Radix. Sorter (2) // pgm 15_20. java public class Radix. Sorter extends Abstract. Sorter { protected void sort (Int[] array) { Int[] temp. Array = new Int[n]; 75

A classe Radix. Sorter (3) for(int i = 0; i < p; ++i) {

A classe Radix. Sorter (3) for(int i = 0; i < p; ++i) { for(int j = 0; j < R; ++j) count[j] = 0; for(int k = 0; k < n; ++k) { // r * i é o número de dígitos argumento do right shift // R – 1 é a máscara para R = 10000, R - 1 = 1111 ++count[( array[k]. int. Value() >>> (r*i) ) & (R-1)]; temp. Array[k] = array[k]; } int pos = 0; for(int j = 0; j < R; ++j) { int tmp = pos; pos += count[j]; count[j] = tmp; } 76

A classe Radix. Sorter (4) for(int k = 0; k < n; ++k) {

A classe Radix. Sorter (4) for(int k = 0; k < n; ++k) { int j = ( temp. Array[k]. int. Value() >>> (r*i) ) & (R-1); array[count[j]++] = temp. Array[k]; } } } //. . . } 77