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.

Slides:



Advertisements
Apresentações semelhantes
LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Advertisements

UFSC-CTC-INE INE Estruturas de Dados
Ordenação de Dados em Memória
Aula T-09 – BCC202 Listas (Parte 1) Túlio Toffolo www. decom. ufop
Programação em Java Prof. Maurício Braga
Estruturas de Dados Marcio Gonçalves.
Katia S. Guimarães QUICKSORT Katia S. Guimarães
ESTRUTURA DE DADOS LES.
Linguagem de Programação IX Métodos de Ordenação
Algoritmos de Ordenação
Algoritmos de Busca CONTEÚDO (1) Motivação (2) Busca Linear
Algoritmos de Ordenação
Classificação de Dados
Série de Exercícios.
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
Shell Sort.
Pesquisa em Memória Primária
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
HeapSort Filas de Prioridade – Heap
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
David Menotti Estruturas de Dados I DECOM – UFOP
FACENS – Engenharia da Computação Lógica Computacional II
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Ordenação Facilitar e aumentar a eficiência das operações de pesquisa sobre esses dados Pode ser crescente ou decrescente A seqüência de entrada, normalmente,
Classificação e Pesquisa de Dados
Classificação (Ordenação) de dados
Algoritmos Escher.
Métodos de Classificação por Seleção: HeapSort
Classificação de dados por Troca: QuickSort
Método de Ordenação: InsertionSort
Métodos de Classificação por Seleção
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Ordenação de Dados.
Marco Antonio Montebello Júnior
Algoritmos e Estrutura de Dados: Uma pequena motivação
Algoritmos de Ordenação
Algoritmos de Ordenação
Insertion Sort.
Algoritmos de ordenação
Desempenho, Método de Shell, Quicksort
Complexidade de algoritmos e Classificação (Ordenação) de dados
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
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.
Ceça Moraes – Introdução à Programação SI1
Algoritmos de Ordenação
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações.
Como analisar um algoritmo
DCC 001 Programação de Computadores 2º Semestre de 2011
Métodos de Ordenação.
CLASSIFICAÇÃO DE DADOS
Algoritmos e Programação MC102
Prof. Alessandro Gonçalves
ATAL – Prof. Jorge Figueiredo Ordenação AT AL Análise e Técnicas de Algoritmos Análise de Algoritmos de Ordenação.
Classificação Ordenação de Dados
Métodos de Ordenação Externa
ORDENAÇÃO EM TEMPO LINEAR
Métodos de Pesquisa: Sequencial e Binária
Classificação (Ordenação) de dados
USP – ICMC – SSC SSC0300 2º Semestre 2015
Classificação (Ordenação) de dados. Roteiro Contextualização e definições sobre Classificação Métodos de Classificação de Dados.
Campus Pau dos Ferros Disciplina de Algoritmos Prof. Demétrios Coutinho INFORMÁTICA BÁSICA Algoritmos de Ordenação.
Algoritmos com matrizes e vetores
Métodos de Pesquisa e Ordenação
Algoritmos de ordenação Estruturas avançadas de dados I
Transcrição da apresentação:

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

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

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

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

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

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

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

Programação II – Prof. Mateus Raeder chave (a) antes da classificação chave (b) após a classificação Reorganização Física

Programação II – Prof. Mateus Raeder chave (a) antes da classificação (b) após a classificação chave cabeça da lista Encadeamento

Programação II – Prof. Mateus Raeder Chave Chave VIO Vetor Indireto de Ordenação

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

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

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

Programação II – Prof. Mateus Raeder Vetor original Divisão inicial Não ordenado Ordenado... Primeira iteração Segunda iteração Inserção Direta

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

Programação II – Prof. Mateus Raeder Proposto por Ronald Shell em 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

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

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

Programação II – Prof. Mateus Raeder Original Primeiro passo: h = Último passo : h=1 ShellSort

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

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

Programação II – Prof. Mateus Raeder Primeira Varredura compara par (28, 26) : troca compara par (28, 30) : não troca compara par (30, 24) : troca compara par (30, 25) : troca fim da primeira varredura Exemplo: Suponha que se deseja classificar em ordem crescente o seguinte vetor de chaves: Método da Bolha (BubbleSort)

Programação II – Prof. Mateus Raeder Segunda Varredura compara par (26, 28) : não troca compara par (28, 24) : troca compara par (28, 25) : troca fim da segunda varredura compara par (26, 24) : troca compara par (26, 25) : troca fim da terceira varredura Terceira Varredura Método da Bolha (BubbleSort)

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)

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

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

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:

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)

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

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

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

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

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

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

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

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 quicksort(a, 0, a.length-1) i j ij ij ij ij quicksort(a, 0, 3) quicksort(a, 5, 9)

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 ij quicksort(a, 0, 0) quicksort(a, 2, 3) lohi x=a[7] ijjij iiijiji quicksort(a, 5, 8)

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); } lohi x=a[6] ij ij quicksort(a, 5, 6) lohi x=a[2] iijijjji

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

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

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

Suponha que se deseja classificar o seguinte vetor: Simule as iterações necessárias para a classificação. Classificação por Seleção Direta Programação II – Prof. Mateus Raeder

IteraçãoVetorChavePermutaçãoVetor orde- Selecionada nado até a posição e e e e e e e Programação II – Prof. Mateus Raeder Classificação por Seleção Direta

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