A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Classificação. 2 Métodos de Classificação Os métodos de classificação podem ser dos tipos: Classificação interna – quando toda a coleção de itens a classificar.

Apresentações semelhantes


Apresentação em tema: "Classificação. 2 Métodos de Classificação Os métodos de classificação podem ser dos tipos: Classificação interna – quando toda a coleção de itens a classificar."— Transcrição da apresentação:

1 Classificação

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

3 3 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.

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

5 5 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: Bubble Sort Shake Sort Quick Sort

6 6 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: Inserção Simples Shell Sort

7 7 Exemplo de Inserção Simples

8 8

9 9

10 10 Exemplo de Inserção Simples

11 11 Exemplo de Inserção Simples

12 12 Exemplo de Inserção Simples

13 13 Exemplo de Inserção Simples

14 14 Exemplo de Inserção Simples

15 15 Exemplo de Inserção Simples

16 16 Exemplo de Inserção Simples

17 17 Exemplo de Inserção Simples

18 18 Exemplo de Inserção Simples

19 19 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: Seleção Direta Heap Sort

20 20 Exemplo de Seleção Direta

21 21 Exemplo de Seleção Direta

22 22 Exemplo de Seleção Direta

23 23 Exemplo de Seleção Direta

24 24 Exemplo de Seleção Direta

25 25 Exemplo de Seleção Direta

26 26 Exemplo de Seleção Direta

27 27 Exemplo de Seleção Direta

28 28 Exemplo de Seleção Direta

29 29 Exemplo de Seleção Direta

30 30 Exemplo de Seleção Direta

31 31 Exemplo de Seleção Direta

32 32 Exemplo de Quick Sort (1)

33 33 Exemplo de Quick Sort (2)

34 34 Exemplo de Shell Sort (1)

35 35 Exemplo de Shell Sort (2)

36 36 Exemplo de Shell Sort (3)

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

38 38 Hierarquia de classes para a classificação interna

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

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

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

42 42 Insertion Sorting

43 43 A Classe StraightInsertionSorter // pgm15_03.java public class StraightInsertionSorter extends AbstractSorter { protected void sort() { for(int i = 1; i < n; ++i) for(int j = i; j > 0 && array[j - 1].isGT (array [j]); --j) { swap(j, j - 1); }

44 44 A Classe BinaryInsertionSorter (1) // pgm15_04.java public class BinaryInsertionSorter extends AbstractSorter { protected void sort() { for(int i = 1; i < n; ++i) { Comparable tmp = array[i]; int left = 0; int right = i;

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

46 46 Bublesort

47 47 A Classe BubbleSorter // pgm15_05.java public class BubbleSorter extends AbstractSorter { protected void sort() { for(int i = n; i > 1; --i) for(int j = 0; j < i - 1; ++j) if(array[j].isGT(array[j + 1])) swap(j, j + 1); }

48 48 QuickSort

49 49 A Classe Abstrata AbstractQuickSorter (1) // pgm15_06.java public abstract class AbstractQuickSorter extends AbstractSorter { protected static final int cutOff = 2; // minimum cut-off protected abstract int selectPivot(int left, int right); //... }

50 50 A Classe Abstrata AbstractQuickSorter (2) // pgm15_07.java public abstract class AbstractQuickSorter extends AbstractSorter { protected void sort(int left, int right) { if(right - left + 1 > cutOff) { int p = selectPivot(left, right); swap(p, right); Comparable pivot = array[right]; int i = left; int j = right - 1;

51 51 A Classe Abstrata AbstractQuickSorter (3) for(;;) { while(i < j && array[i].isLT(pivot)) ++i; while(i < j && array[j].isGT(pivot)) --j; if(i >= j) break; swap(i++, j--); } if(array[i].isGT(pivot)) swap(i, right); if(left < i) sort(left, i - 1); if(right > i) sort(i + 1, right); } //... }

52 52 A Classe Abstrata AbstractQuickSorter (4) // pgm15_08.java public abstract class AbstractQuickSorter extends AbstractSorter { protected void sort() { sort(0, n - 1); Sorter sorter = new StraightInsertionSorter(); sorter.sort(array); } //... }

53 53 A Classe MedianOfThreeQuickSorter // pgm15_09.java public class MedianOfThreeQuickSorter extends AbstractQuickSorter { protected int selectPivot(int left, int right) { int middle = (left + right) / 2; if (array[left].isGT(array[middle])) swap(left, middle); if(array[left].isGT(array[right])) swap(left, right); if(array[middle].isGT(array[right])) swap(middle, right); return middle; }

54 54 StraightSelectionSort

55 55 A Classe StraightSelectionSorter // pgm15_10.java public class StraightSelectionSorter extends AbstractSorter { protected void sort() { for(int i = n; i > 1; --i) { int max = 0; for(int j = 1; j < i; ++j) if(array[j].isGT(array[max])) max = j; swap(i - 1, max); }

56 56 HeapSort

57 57 Construção de um Heap

58 58 Heap Sorting

59 59 A classe HeapSorter (1) // pgm15_11.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void percolateDown(int i, int length) { while(2 * i <= length) { int j = 2 * i; if( j < length && array[j base].isGT(array[j - base]) )

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

61 61 A classe HeapSorter (3) // pgm15_12.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void buildHeap() { for(int i = n / 2; i > 0; --i) percolateDown (i, n); } //... }

62 62 A classe HeapSorter (4) // pgm15_13.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void sort() { buildHeap(); for(int i = n; i >= 2; --i) { swap(i - base, 1 - base); percolateDown(1, i - 1); } //... }

63 63 Two Way Merging

64 64 Two Way Merge Sorting

65 65 A classe TwoWayMergeSorter (1) // pgm15_14.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; //... }

66 66 A classe TwoWayMergeSorter (2) // pgm15_15.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; protected void merge(int left, int middle, int right) { int i = left; int j = left; int k = middle + 1;

67 67 A classe TwoWayMergeSorter (3) while(j <= middle && k <= right) { if(array[j].isLT(array[k])) tempArray[i++] = array[j++]; else tempArray[i++] = array[k++]; } while(j <= middle) tempArray[i++] = array[j++]; for(i = left; i < k; ++i) array[i] = tempArray[i]; } //... }

68 68 A classe TwoWayMergeSorter (4) // pgm15_16.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; protected void sort() { tempArray = new Comparable[n]; sort(0, n - 1); tempArray = null; }

69 69 A classe TwoWayMergeSorter (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); } //... }

70 70 Bucket Sorting

71 71 A classe BucketSorter (1) // pgm15_17.java public class BucketSorter extends AbstractSorter { protected int m; protected int[] count; public BucketSorter(int m) { this.m = m; count = new int [m]; } protected void sort() { sort((Int[]) array); } //... }

72 72 A classe BucketSorter (2) // pgm15_18.java public class BucketSorter extends AbstractSorter { 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].intValue()]; for(int i = 0, j = 0; i < m; ++i) for( ; count[i] > 0; --count[i]) array[j++] = new Int(i); } //... }

73 73 Radix Sorting

74 74 A classe RadixSorter (1) // pgm15_19.java public class RadixSorter extends AbstractSorter { 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); } //... }

75 75 A classe RadixSorter (2) // pgm15_20.java public class RadixSorter extends AbstractSorter { protected void sort (Int[] array) { Int[] tempArray = new Int[n];

76 76 A classe RadixSorter (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 = count[( array[k].intValue() >>> (r*i) ) & (R-1)]; tempArray[k] = array[k]; } int pos = 0; for(int j = 0; j < R; ++j) { int tmp = pos; pos += count[j]; count[j] = tmp; }

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


Carregar ppt "Classificação. 2 Métodos de Classificação Os métodos de classificação podem ser dos tipos: Classificação interna – quando toda a coleção de itens a classificar."

Apresentações semelhantes


Anúncios Google