Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMauro Nelson Meneses Fragoso Alterado mais de 8 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.