Algoritmos de Ordenação e Pesquisa Marco Antonio Moreira de Carvalho Algoritmos e Estrutura de Dados Bibliografia Básica Cormen, Leiserson, Rivest. Introduction l to Algorithms. 2nd edition. MIT Press, 2001. Capítulos 2, 6, 7, 8. Aho, Alfred V., Hopcroft, John F., l Ullman, Jeffrey D., Data Structure and Algorithms, Massachusetts: Addison- Wesley, 1987. Capítulo 8. 2 Ordenação e Pesquisa Considerando um conjunto de dados: l Organizá-los de acordo com algum critério (>, <, ≥, ≤, l etc.); ou Encontrar algum que atenda um critério específico l (maior, menor, =, etc.). Estas tarefas devem ser realizadas eficientemente l O tempo para executá-las depende da quantidade de l dados envolvidos. Aplicação direta: Organização e manipulação de l dados. 3 Ordenação e Pesquisa Os elementos são chamados de chaves; l Pode haver chaves de valores idênticos; l Os valores não necessariamente são sequenciais. l Chaves podem ser números, strings, registros, etc. l 4 Estrutura de Dados Vetores l Mantêm uma série de elementos sequenciais l mantidos em uma ordem linear como um único, porém, com possibilidade de acesso individual; Cada elemento possui um índice que indica sua l posição no vetor e permite acessá-lo diretamente; Vetores tem tamanhos fixos. l 0 1 2 3 4 5 Índice 4 8 15 16 23 42 Valor 5 Pesquisa Dado um conjunto de n chaves {k , k , …, k }: l 1 2 n Determinar a existência e/ou determinar a posição de l determinada chave k; i Determinar a maior, a menor, etc. l Dada a sequência de chaves abaixo, como l determinar a existência da chave 8? Não sabemos se as chaves estão ordenadas… ? ? ? ? ? ? 6 Métodos de Pesquisa Pesquisa Sequencial l Pesquisa Binária l 7 Pesquisa Sequencial Método intuitivo l : Dada uma chave k, compará-la a cada chave no l vetor, caso haja uma igual, a chave está no vetor Caso todas as chaves tenham sido comparadas e não l houve nenhuma igual, a chave não existe no vetor. k = 8 42 16 4 15 8 23 Chave encontrada! 8 Pesquisa Sequencial Código ! ! int Sequencial(int A[], int n, int k, int *posicao)! ! {! ! int i;! //sinaliza se a chave foi encontrada! int achou = 0;! ! ! //para cada chave! for(i=0; i<n; i++)! //compara com a chave de busca! if(A[i] == k)! ! {! //se encontrou! *posicao = i;! //armazena a posição! achou = 1;! ! }! //indica se encontrou ou não! ! return achou;! }! 9 Pesquisa Sequencial Complexidade int Sequencial(int A[], int n, int k, int *posicao)! {! int i;! Custo Repetições int achou = 0;! ! ! ! for(i=0; i<n; i++)! c ! !n! 1 if(A[i] == k)! c n-1! !! 2 {! *posicao = i;! achou = 1;! }! return achou;! }! Tempo = Θ(n) 10
Description: