Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Documentos relacionados
ORDENAÇÃO E BUSCA 1. MÉTODOS DE ORDENAÇÃO

MÉTODOS DE ORDENAÇÃO DE DADOS EM MEMÓRIA PRIMÁRIA. Material da Prof. Ana Eliza

Linguagem C: Algoritmos de Ordenação

MÉTODOS DE CLASSIFICAÇÃO EM MEMÓRIA PRIMÁRIA. George Gomes Cabral

Algoritmos de Busca. Profº Carlos Alberto T. Batista

Projeto e Análise de Algoritmos

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

Programação Estruturada

Métodos de Ordenação Parte 3

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Aprendendo a Programar Programando numa Linguagem Algorítmica Executável (ILA)

Métodos de Classificação

Bubble Sort. Tempo total O(n 2 )

Métodos de Ordenação Parte I

Métodos de Classificação

ALGORITMOS DE ORDENAÇÃO

INF111 Programação II Aulas 11, 12, 13 Ordenação

2. Ordenação por Seleção

Algoritmos de Ordenação

Banco de Dados. Métodos de Ordenação de Dados. Prof. Walteno Martins Parreira Jr

USP - ICMC - SSC SSC o. Semestre Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

Algoritmia e Programação

O Problema da Ordenação Métodos de Ordenação Parte 1

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI1

Métodos de Ordenação

BCC202 - Estrutura de Dados I

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior

Ordenação - Motivação

O mais leve e o mais pesado Algoritmos de Ordenação

MC102 - Algoritmos e programação de computadores. Aula 16: Busca e Ordenação em vetores

Programação de Computadores Ordenação de Arranjos

Aula 18 Algoritmos básicos de busca e classificação

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Heapsort é um método de ordenação cujo princípio de funcionamento é o mesmo utilizado para a ordenação por seleção.

Trabalho: Algoritmos de Busca e Ordenação. 1 Introdução. Prof. Bruno Emerson Gurgel Gomes IFRN - Câmpus Currais Novos. 31 de outubro de 2012

Introdução Métodos de Busca Parte 1

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Existem duas categorias de algoritmos de ordenação: Os algoritmos de ordenação são avaliados de acordo com os seguintes critérios:

Método BubbleSort. Estrutura de Dados II Prof Jairo Francisco de Souza

Introdução à Programação

Aula 12 Métodos de Classificação: - Classificação por Inserção Direta - Classificação por Seleção Direta

Métodos de Busca Parte 1

Conteúdo. Busca Seqüencial. Busca Binária. Algoritmos de Ordenação e Busca e sua Análise de Complexidade. Alneu de Andrade Lopes Rosane Minghim

Linguagem C: Ordenação

Algoritmos de pesquisa

MÉTODOS DE PESQUISA DE DADOS EM MEMÓRIA PRIMÁRIA. Material da Prof. Ana Eliza

CIC 110 Análise e Projeto de Algoritmos I

Módulo 16 - Ordenação

Método de ordenação - objetivos:

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante

Ordenação: HeapSort. Prof. Túlio Toffolo BCC202 Aula 17 Algoritmos e Estruturas de Dados I

Pesquisa. Pesquisa. Pesquisa. O problema de procurar(pesquisar) alguma informação numa tabela ou num catálogo é muito comum Exemplo:

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Algoritmos de pesquisa

Carlos Eduardo Batista. Centro de Informática - UFPB

Capacitação em Linguagem C Parte 2

Ordenação por Seleção Métodos de Ordenação Parte 3

Métodos de Ordenação

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Centro de Informá-ca Universidade Federal de Pernambuco. Vinicius Cardoso Garcia 2011 Vinicius Cardoso Garcia

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

ORDENAÇÃO DE ARQUIVOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Métodos de Ordenação Parte 2

Métodos de ordenação. Bubble sort:

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

Programação de Computadores II. Cap. 16 Ordenação

Análise de Algoritmos Estrutura de Dados II

Ordenação em Memória Primária Estrutura de Dados II

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

Limite assintótico para a ordenação, Ordenação em tempo linear

Ordenação de Dados. Ordenação de Dados

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Algoritmos de ordenação: Bucketsort, Radixsort e Seleção

Análise de Algoritmos

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

Ordenação por Intercalação Métodos de Ordenação Parte 4

TCC 00308: Programação de Computadores I Introdução

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Algoritmos de Ordenação

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

Algoritmos de Busca em Vetores

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

5. Algoritmos de Ordenação

Universidade Veiga de Almeida Algoritmos e Linguagem I

Estruturas de Dados Algoritmos de Ordenação

Transcrição:

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1 ORDENAÇÃO E BUSCA Ordenação: Bublesort, seleção direta e inserção direta. Busca: linear e binária 1 - ORDENAÇÃO (CLASSIFICAÇÃO) DE DADOS Em diversas aplicações, os dados devem ser armazenados obedecendo a uma determinada ordem. Alguns algoritmos podem explorar a ordenação dos dados para operar de maneira mais eficiente, do ponto de vista de desempenho computacional. Para obtermos os dados ordenados, temos basicamente duas alternativas: ou inserimos os elementos na estrutura de dados respeitando a ordenação (dizemos que a ordenação é garantida por construção), ou, a partir de um conjunto de dados já criado, aplicamos um algoritmo para ordenar seus elementos. Assim, Classificar é o processo de ordenar os elementos pertencentes a uma estrutura de dados em memória (vetor) ou em disco (registros de uma tabela de dados) em ordem ascendente ou descendentes. Os fatores que influem na eficácia de um algoritmo de classificação são os seguintes: - o número de registros a serem classificados; - se todos os registros caberão ou não na memória interna disponível; - o grau de classificação já existente; - forma como o algoritmo irá ordenar os dados; 1.1 - Bubblesort Por ser simples e de entendimento e implementação fáceis, o Bubblesort (bolha) está entre os mais conhecidos e difundidos métodos de ordenação de arranjos. Mas não se trata de um algoritmo eficiente, é estudado para fins de desenvolvimento de raciocínio. O princípio do Bubblesort é a troca de valores entre posições consecutivas, fazendo com que os valores mais altos ( ou mais baixos ) "borbulhem" para o final do arranjo (daí o nome Bubblesort). O algoritmo de ordenação bolha, ou bubblesort, recebeu este nome pela imagem pitoresca usada para descrevê-lo: os elementos maiores são mais leves, e sobem como bolhas até suas posições corretas. A idéia fundamental é fazer uma série de comparações entre os elementos do vetor. Quando dois elementos estão fora de ordem, há uma inversão e esses dois elementos são trocados de posição, ficando em ordem correta. Assim, o primeiro elemento é comparado com o segundo. Se uma inversão for encontrada, a troca é feita. Em seguida, independente se houve ou não troca após a primeira comparação, o segundo elemento é comparado com o terceiro, e, caso uma inversão seja encontrada, a troca é feita. O processo continua até que o penúltimo elemento seja comparado com o último. Com este processo, garante-se que o elemento de maior valor do vetor será levado para a última posição. A ordenação continua, posicionando o segundo maior elemento, o terceiro, etc., até que todo o vetor esteja ordenado. Veja o exemplo a seguir: Nesta ilustração vamos ordenar o arranjo em ordem crescente de valores. Consideremos inicialmente um arranjo qualquer desordenado. O primeiro passo é se fazer a comparação entre os dois elementos das primeiras posições : Assim verificamos que neste caso os dois primeiros elementos estão desordenados entre si, logo devemos trocá-los de posição. E assim continuamos com as comparações dos elementos subsequentes:

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 2 Aqui, mais uma vez, verificamos que os elementos estão desordenados entre si. Devemos fazer a troca e continuar nossas comparações até o final do arranjo: Pode-se dizer que o número 5 "borbulhou" para a sua posição correta, lá no final do arranjo. O próximo passo agora será repetir o processo de comparações e trocas desde o início do arranjo. Só que dessa vez o processo não precisará comparar o penúltimo com o último elemento, pois o último número, o 5, está em sua posição correta no arranjo. Exemplos: 1) long int aux; // Variável auxiliar para fazer a troca, caso necessário for ( long int i=0; i <= tam-2; i++ ){ for ( long int j=0; j<= tam-2-i; j++ ){ if(array[j] > Array[j+1]) { // Caso o elemento de uma posição menor aux = Array[j]; // for maior que um elemento de uma posição Array[j] = Array[j+1]; // maior, faz a troca. Array[j+1] = aux; 2) void bubblesort1(int v[], int n){ int i, j, aux; for(i=0; i<n; i++) for(j=0; j<n-1; j++) if(v[j]>v[j+1]) { aux = v[j]; v[j] = v[j+1]; v[j+1]=aux; 3) void bubblesort2(int v[], int n){ int j,ok=0, aux; while(!ok){ ok=1; for(j=0;j<n-1;j++) if(v[j] > v[j+1]){ aux = v[j]; v[j] = v[j+1]; v[j+1] =aux; ok=0; 1.2 - Seleção Direta Consiste em encontrar a menor chave por pesquisa sequencial. Encontrando a menor chave, essa é permutada com a que ocupa a posição inicial do vetor, que fica então reduzido a um elemento. O processo é repetido para o restante do vetor, sucessivamente, até que todas as chaves tenham sido selecionadas e colocadas em suas posições definitivas.

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 3 Uma outra variação deste método consiste em posicionar-se no primeiro elemento e aí ir testando-o com todos os outros (segundo)... (último), trocando cada vez que for encontrado um elemento menor do que o que está na primeira posição. Em seguida passa-se para a segunda posição do vetor repetindo novamente todo o processo. Ex: Exemplo: long int aux; // Nossa variável auxiliar long int j; for( long int i=1; i <= tam - 1; i++ ) { aux = Array[i]; j = i - 1; while( j >= 0 && aux < Array[j] ) // Puxa os valores até encontrar { // a posição correta Array[j + 1] = Array[j] ; j--; Array[j+1] = aux; // Coloca o valor na posição correta 1.3 - Inserção Direta O método de ordenação por Inserção Direta é o mais rápido entre os outros métodos considerados básicos Bubblesort e Seleção Direta. A principal característica deste método consiste em ordenarmos o arranjo utilizando um sub-arranjo ordenado localizado em seu inicio, e a cada novo passo, acrescentamos a este sub-arranjo mais um elemento, até que atingimos o último elemento do arranjo fazendo assim com que ele se torne ordenado. Realmente este é um método difícil de se descrever, então vamos passar logo ao exemplo.

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 4 Consideremos inicialmente um arranjo qualquer desordenado: Inicialmente consideramos o primeiro elemento do arranjo como se ele estivesse ordenado, ele será considerado o sub-arranjo ordenado inicial: Agora o elemento imediatamente superior ao o sub-arranjo ordenado, no o exemplo o número 3, deve se copiado para uma variável auxiliar qualquer. Após copiá-lo, devemos percorrer o sub-arranjo a partir do último elemento para o primeiro. Assim poderemos encontrar a posição correta da nossa variável auxiliar dentro do sub-arranjo: No caso verificamos que a variável auxiliar é menor que o último elemento do o sub-arranjo ordenado (o subarranjo só possui por enquanto um elemento, o número 5 ). O número 5 deve então ser copiado uma posição para a direita para que a variável auxiliar com o número 3, seja colocada em sua posição correta: Verifique que o sub-arranjo ordenado possui agora dois elementos. Vamos repetir o processo anterior para que se continue a ordenação. Copiamos então mais uma vez o elemento imediatamente superior ao o sub-arranjo ordenado para uma variável auxiliar. Logo em seguida vamos comparando nossa variável auxiliar com os elementos do subarranjo, sempre a partir do último elemento para o primeiro: Neste caso verificamos que a nossa variável auxiliar é menor que o último elemento do subarranjo. Assim, copiamos este elemento para a direita e continuamos com nossas comparações : Aqui, mais uma vez a nossa variável auxiliar é menor que o elemento do sub-arranjo que estamos comparando. Por isso ele deve ser copiado para a direita, abrindo espaço para que a variável auxiliar seja colocada em sua posição correta : Verifique que agora o sub-arranjo ordenado possui 3 elementos. Continua-se o processo de ordenação copiando mais uma vez o elemento imediatamente superior ao o sub-arranjo para a variável auxiliar. Logo em seguida vamos comparar essa variável auxiliar com os elementos do o sub-arranjo a partir do último elemento:

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 5 Veja que nossa variável auxiliar é menor que o elemento que está sendo comparado no o subarranjo. Então ele deve ser copiado para a direita para que continuemos com nossas comparações: Veja que aqui ocorre o inverso. A variável auxiliar é maior que o elemento do sub-arranjo que estamos comparando. Isto significa que já encontramos a posição correta para a nossa variável auxiliar. Basta agora copiá-la para sua posição correta, ou seja, copiá-la para o elemento imediatamente superior ao elemento que estava sendo comparado, veja: o sub-arranjo ordenado possui agora quatro elementos. Repete-se mais uma vez o processo todo de ordenação, copiando o elemento imediatamente superior ao o sub-arranjo para uma variável auxiliar. Aí compara-se essa variável auxiliar com os elementos do o sub-arranjo, lembrando-se que a ordem é do último elemento para o primeiro. Caso seja necessário, copia-se para a direita os elementos que forem maiores que a variável auxiliar até que se encontre um elemento menor ou até que se chegue ao início do arranjo. É simples: Aqui encontramos um elemento menor que a variável auxiliar. Isto significa que encontramos sua posição correta dentro do sub-arranjo. Basta agora copiá-la para a posição correta: Exemplo: void insertion(int v[], int n){ int aux, i, j; for(i=1; i<n; i++){ aux = v[i]; for(j=i-1; j>=0; j--) if(v[j]>aux) v[j+1] = v[j]; else break; j++; v[j]=aux;

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 6 2 BUSCA A busca é o processo em que se determina se um particular elemento x é membro de uma determinado vetor V. Dizemos que a busca tem sucesso se e que fracassa em caso contrário. 2.1 Busca Linear A forma mais simples de se consultar um vetor em busca de um item particular é, a partir do seu início, ir examinando cada um de seus itens até que o item desejado seja encontrado ou então que seu final seja atingido. Como os itens do vetor são examinados linearmente, em seqüência, esse método é denominado busca linear ou busca seqüencial. Para exemplificar seu funcionamento, vamos implementar uma função que determina se um certo número x consta de um vetor de números inteiros. Exemplo: 2.1.1 - Análise da busca linear A vantagem da busca linear é que ela sempre funciona, independentemente do vetor estar ou não ordenado. A desvantagem é que ela é geralmente muito lenta; pois, para encontrar um determinado item x, a busca linear precisa examinar todos os itens que precedem x no vetor.

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 7 2.2 - BUSCA BINÁRIA Se não sabemos nada a respeito da ordem em que os itens aparecem no vetor, o melhor que podemos fazer é uma busca linear. Entretanto, se os itens aparecem ordenados 1, podemos usar um método de busca muito mais eficiente. Esse método é semelhante àquele que usamos quando procuramos uma palavra num dicionário: primeiro abrimos o dicionário numa página aproximadamente no meio; se tivermos sorte de encontrar a palavra nessa página, ótimo; senão, verificamos se a palavra procurada ocorre antes ou depois da página em que abrimos e então continuamos, mais ou menos do mesmo jeito, procurando a palavra na primeira ou na segunda metade do dicionário... Como a cada comparação realizada o espaço de busca reduz-se aproximadamente à metade, esse método é denominado busca binária. Seja um vetor 2 tal que esteja armazenado aproximadamente no meio dele. Então temos três possibilidades: x = am: nesse caso, o problema está resolvido; x < am: então x deverá ser procurado na primeira metade; e x > am: então x deverá ser procurado na segunda metade. Caso a busca tenha que continuar, podemos proceder exatamente da mesma maneira: verificamos o item existente no meio da metade escolhida e se ele ainda não for aquele que procuramos, continuamos procurando no meio do quarto escolhido, depois no meio do oitavo e assim por diante até que o item procurado seja encontrado ou que não haja mais itens a examinar. 2.2.1 - Análise da busca binária Ao contrário da busca linear, a busca binária somente funciona corretamente se o vetor estiver ordenado. Isso pode ser uma desvantagem. Entretanto, à medida em que o tamanho do vetor aumenta, o número de comparações feitas pelo algoritmo de busca binária tende a ser muito menor que aquele feito pela busca linear. Então, se o vetor é muito grande, e a busca é uma operação muito requisitada, esse aumento de eficiência pode compensar o fato de termos que ordenar o vetor antes de usar a pesquisa binária. 1 Quando nada for dito em contrário, ordenado quer dizer ordenado de forma ascendente'. 2 O operador indica concatenação de seqüências.