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

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

Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

Apresentações semelhantes


Apresentação em tema: "Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof."— Transcrição da apresentação:

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

2 Programação II – Prof. Mateus Raeder Classificação de Dados

3 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

4 Programação II – Prof. Mateus Raeder Sejam R 1, R 2, …, R N, N ítens (chamados registros) Cada registro R i, é formado por uma chave C i 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  i 1, i 2, …, i N  N das chaves, tal que C i1  C i2  …  C iN. Um conjunto de registros é chamado de arquivo Definições

5 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

6 Programação II – Prof. Mateus Raeder Escreva um algoritmo para classificar um conjunto de 5 números em ordem crescente. Exercício

7 Programação II – Prof. Mateus Raeder –Reorganização Física –Encadeamento –Vetor Indireto de Ordenação (VIO) Formas de Representação do Resultado

8 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

9 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 lista Encadeamento

10 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

11 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

12 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

13 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

14 Programação II – Prof. Mateus Raeder 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

15 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ção do 1º elemento do segmento não ordenado no segmento ordenado Inserção Direta

16 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

17 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=2 2 =4 h=2 1 =2 h=2 0 =1 3 passos ShellSort

18 Programação II – Prof. Mateus Raeder Testes empíricos sugerem que a melhor escolha para os valores de h é a sequência onde h t = 3h t-1 +1 –3*0+1 = 1 –3*1+1 = 4 –3*4+1 = 13 –3*13+1 = 40 ShellSort

19 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 = 4 11 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

20 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

21 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

22 Programação II – Prof. Mateus Raeder Primeira Varredura 28 26 30 24 25compara par (28, 26) : troca 26 28 30 24 25compara par (28, 30) : não troca 26 28 30 24 25compara par (30, 24) : troca 26 28 24 30 25compara par (30, 25) : troca 26 28 24 25 30fim 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)

23 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)

24 Programação II – Prof. Mateus Raeder public static void bubbleSort(int a[]) { for (int i = a.length-1; i>0; i--) { // nro de varreduras for (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)

25 Programação II – Prof. Mateus Raeder Método da Bolha (BubbleSort) Considerando o seguinte vetor : 131125 101821 23 1) Em quantas varreduras o vetor é classificado ? 2) Como identificar, a partir da última varredura, quantas chaves já estão classificadas?

26 Programação II – Prof. Mateus Raeder Considerando o seguinte vetor : 131125 101821 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)

27 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:

28 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)

29 Programação II – Prof. Mateus Raeder A idéia básica é a de dividir o problema, de ordenar um conjunto de n itens em dois problemas menores. A seguir, os problemas menores são ordenados independentemente e depois os resultados são combinados para produzir a solução do problema maior! (Ziviani, 1996) Método QuickSort

30 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

31 Programação II – Prof. Mateus Raeder Princípio de classificação –inicialmente, o vetor de chaves C é particionado em três segmentos S 1, S 2 e S 3 –S 2 terá comprimento 1 e conterá uma chave denominada particionadora ou pivô – S 1 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 S 2 – S 3 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 S 2 QuickSort

32 Programação II – Prof. Mateus Raeder Vetor Inicial : C [ 1.. n ] 1 n Vetor Particionado 1 n S1S1 S2S2 S3S3 K - 1kK + 1 Onde:C [ i ]  C [ k ], para i = 1, …, k - 1 C [ i ] > C [ k ], para i = k + 1, …, n QuickSort

33 Programação II – Prof. Mateus Raeder Princípio de classificação ( continuação … ) –o processo de particionamento é reaplicado aos segmentos S 1 e S 2 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

34 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

35 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

36 Programação II – Prof. Mateus Raeder Quick Sort 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); } lo x=a[4] hi i j 0 1 2 3 4 5 6 7 8 9 quicksort(a, 0, a.length-1) i j ij ij 0 1 2 3 4 5 6 7 8 9 ij ij quicksort(a, 0, 3) quicksort(a, 5, 9)

37 Programação II – Prof. Mateus Raeder Quick Sort 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); } lo x=a[1] hi 0 1 2 3 4 5 6 7 8 9 ij quicksort(a, 0, 0) quicksort(a, 2, 3) lohi x=a[7] ijjij 0 1 2 3 iiijiji quicksort(a, 5, 8) 0 1 2 3 4 5 6 7 8 9

38 Programação II – Prof. Mateus Raeder Quick Sort 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); } 0 1 2 3 4 5 6 7 8 9 lohi x=a[6] ij 0 1 2 3 4 5 6 7 8 9 ij quicksort(a, 5, 6) lohi x=a[2] iijijjji

39 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ção no meio do vetor. Simule as iterações necessárias para a classificação, segundo o algoritmo apresentado. Quick Sort

40 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

41 Princípio de classificação –a seleção da menor chave é feita por pesquisa seqüencial –a menor chave encontrada é permutada com a que ocupa a posição inicial do vetor, que fica reduzido de um elemento –o processo de seleção é repetido para a parte restante do vetor, até que todas as chaves tenham sido selecionadas e colocadas em suas posições definitivas Classificação por Seleção Direta Programação II – Prof. Mateus Raeder

42 Suponha que se deseja classificar o seguinte vetor: 9 25 10 18 5 7 15 3 Simule as iterações necessárias para a classificação. Classificação por Seleção Direta Programação II – Prof. Mateus Raeder

43 IteraçãoVetorChavePermutaçãoVetor orde- Selecionada nado até a posição 19 25 10 18 5 7 15 3 3 9 e 3 23 25 10 18 5 7 15 9 5 25 e 5 1 33 5 10 18 25 7 15 9 7 10 e 7 2 43 5 7 18 25 10 15 9 9 18 e 9 3 53 5 7 9 25 10 15 18 10 25 e 10 4 63 5 7 9 10 25 15 18 15 25 e 15 5 73 5 7 9 10 15 25 18 18 25 e 18 6 83 5 7 9 10 15 18 25 8 Programação II – Prof. Mateus Raeder Classificação por Seleção Direta

44 public static void selectionSort (int a[]) { int min=0, ch; for (int i=0; i<a.length-1; i++) { min = i;// mínimo inicial for (int j = i + 1; j<a.length; j++) if (a [ j ] < a [ min ]) min = j; // acha o novo mínimo ch = a [ i ]; a [ i ] = a [ min ] ;// coloca o novo mínimo a [ min ] = ch; // na posição correta } Programação II – Prof. Mateus Raeder Classificação por Seleção Direta


Carregar ppt "Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof."

Apresentações semelhantes


Anúncios Google