Sunteți pe pagina 1din 9

MC-102 Algoritmos e Programacao de Computadores IC-UNICAMP

Aula 17 - Aula sobre mtodos de busca e ordenao e ca


1 Objetivos

Apresentar os diferentes mtodos de busca e ordenaao, destacando suas diferenas e as vantagens e c c desvantagens de cada um.

Motivao ca
Permitir que a busca por um elemento seja feita com ecincia, atravs da escolha de um mtodo e e e adequado. Mostrar os mtodos de ordenaao, seus pontos fracos e tambm onde cada mtodo mais e c e e e adequado, permitindo assim que a escolha do mtodo possa atender a aplicaao. e c

Mtodos de Busca e

Problema Dada uma coleao de n elementos, pretende-se saber se um determinado elemento x existe nessa c coleao. Para efeitos prticos, vamos supor que essa coleao implementada como sendo um vetor c a c e a[0...n-1] de n elementos inteiros.

3.1

Soluo 1 - Pesquisa Seq encial ca u

Uma soluao poss percorrer o vetor desde a primeira posiao at ` ultima. Para cada posiao i, c vel e c ea c comparamos a[i] com x. Se forem iguais dizemos que x existe. Se chegarmos ao m do vetor dizemos que x no existe. Vamos traduzir estas palavras para um algoritmo. a Algoritmo 1: pesquisa seqencial u (1) (2) (3) (4) i <-- 0 Se i = n, escreve "n~o existe" e termina. a Se x = a[i], escreve "existe" e termina. i <-- i+1. Volta ao passo 2.

Este algoritmo chama-se algoritmo de pesquisa seqencial porque varre os elementos da nossa u coleao seqencialmente um aps outro. O algoritmo independente da linguagem de programaao c u o e c em que possa vir a ser implementado. Se quisermos implementar este algoritmo em C ter amos de escrever qualquer coisa deste estilo: i = 0; do { if( i == n ) { printf("n~o existe"); break; } a if( x == a[i] ) { printf("existe"); break; } i++; } while( 1 ); Pergunta Quanto tempo que este algoritmo demora a executar? e Por outras palavras, quantas vezes que a comparaao x == a[i] executada? e c e Resposta * caso x n~o exista no vetor, n vezes. a * caso x exista no vetor, o 1 vez no melhor caso (x est na primeira posiao). a c~ o n vezes no pior caso (x est na ltima posiao). a u c~ o n/2 vezes no caso mdio. e E se o vetor estivesse ordenado?

3.2

Soluo 2 - Pesquisa Binria ca a

Vamos supor agora que o vetor inicial estava ordenado por ordem crescente (se fosse por ordem decrescente o racioc nio era semelhante). Ser que poss a e vel resolver o problema de modo mais eciente? A resposta positiva. O problema que estamos a ver semelhante ao problema de encontrar o e e telefone de uma pessoa numa lista telefnica. Se a lista no estivesse ordenada, no ter o a a amos outra hiptese seno percorrer a lista do principio at ao m (uma tarefa em tudo semelhante a encontrar o a e uma agulha num palheiro). Esse algoritmo seria o equivalente ` pesquisa seqencial que vimos ` a u a pouco. Conhecem algum que procura a lista telefnica do princ e o pio at ao m? Claro que no. Como e a a lista est ordenada alfabeticamente, conseguimos descobrir rapidamente o telefone de uma pessoa. a Abrimos a lista no meio e depois decidimos pelo lado esquerdo ou pelo lado direito. E assim sucessivamente at encontrarmos o nome da pessoa. A cada passo vamos eliminando grande parte das e pginas da lista. a Se o vetor estiver ordenado podemos implementar um algoritmo semelhante ao da lista telefnica. o A idia manter duas variveis, esq e dta, que signicam os limites esquerdo e direito do vetor. A e e a

idia que se o elemento x existe numa posiao a[i] do vetor, ento i tem de estar compreendido entre e e c a esq e dta (esq i dta). Algoritmo 2: pesquisa binria a (1) (2) (3) (4) esq <-- 0 , dta <-- n-1 Se esq > dta, escreve "n~o existe" e termina. a i <-- parte inteira de (esq+dta)/2 Se x = a[i], escreve "existe" e termina. Se x < a[i], dta <-- i-1. Volta ao passo 2. Se x > a[i], esq <-- i+1. Volta ao passo 2.

{ Vamos programar o algoritmo de pesquisa binria em C. a esq = 0; dta = n-1; do { if( esq > dta ) { printf("nao existe"); break; } i = (esq+dta)/2; if( x == a[i] ) { printf("existe"); break; } else if( x < a[i] ) dta = i-1; else esq = i+1; } while( 1 ); Pergunta Quanto tempo que o algoritmo de pesquisa binria demora? e a Por outras palavras, quantas vezes que a comparaao x == a[i] executada? e c e Resposta * no melhor caso, 1 vez. * no pior caso, log2(n). (nota: log2 significa logaritmo de base 2)

Vejamos um exemplo. Se n=1000, o algoritmo de pesquisa seqencial ir executar 1000 comu a paraoes no pior caso. Por sua vez, o algoritmo de pesquisa binria ir executar 10 comparaoes no c a a c pior caso. O logaritmo de base 2 aparece porque estamos sempre a dividir o intervalo ao meio: 1000, 500, 250, 125, 63, 32, 16, 8, 4, 2, 1. E se n=1000000000 (1 bilho) ? Aqui vai a resposta: a * Pesquisa binria faz 30 comparaoes. a c~ * Pesquisa seqencial faz 1000000000 comparaoes! u c~ Qual dos dois algoritmos melhor? No se pode dizer que um melhor do que o outro. Depende e a e ... H vrios pontos que se deve ter em consideraao. a a c 1. Se n pequeno (inferior a 100 ou coisa parecida) no vale a pena estar a fazer pesquisas binrias e a a porque o computador muito rpido a varrer uma coleao de 100 elementos. e a c 2. O algoritmo de pesquisa binria assume que o vetor est ordenado. Ordenar um vetor tambm a a e tem um custo (quantas comparaoes so necessrias para ordenar um vetor de dimenso n c a a a utilizando o algoritmo da aula passada?) 3. Se for para fazer uma s pesquisa, no vale a pena estar a ordenar o vetor. Por outro lado, se o a pretendermos fazer muitos pesquisas, o esforo da ordenaao j poder valer a pena. c c a a

Mtodos de Ordenao e ca

O problema da ordenaao fundamental na computaao, como vimos nos mtodos de pesquisa a c e c e ecincia da busca sempre melhor quando trabalhamos com conjuntos ordenados. e e Existem muitos algoritmos de ordenaao, a escolha do mais eciente vai depender de vrios fatores: c a nmero de itens a ser classicado; se os valores j esto agrupados em subconjuntos ordenados; etc. u a a

4.1

Ordenao por Insero ca ca

A proposta da ordenaao por inserao : c c e Para cada elemento do vetor faa c insira-o na sua posiao correspondente; c~ Durante o processo de ordenaao por inserao a lista ca dividida em duas sub listas, uma com c c os elementos j ordenados e a outra com elementos ainda por ordenar. a No in cio, a sub lista ordenada formada trivialmente apenas pelo primeiro elemento da lista. e Nos mtodos de ordenaao por inserao, a cada etapa i, o i-simo elemento inserido em seu lugar e c c e e apropriado entre os(i-1) elementos j ordenados. Os a ndices dos itens a serem inseridos variam 2 a m. Veja no exemplo abaixo o resultado das varreduras:

Varredura Vetor original 1 2 3 4 4.1.1 Funo de Insero ca ca

X[0] 9 {8 {7 {6 {5

X[1] 8 9} 8 7 6

X[2] 7 {7 9} 8 7

X[3] 6 6 {6 9} 8

X[4] 5 5} 5} {5} 9}

void Insercao(int m,int vet[]) { int i,j,aux; for(i = 1; i < m; i++) { aux = vet[i]; for(j = i-1; (j >= 0) && (aux < vet[j]); j--) vet[j + 1] = vet[j]; vet[j + 1] = aux; } } N mero de Comparaoes: u c Em cada etapa i so executadas no mximo, i comparaoes pois o loop interno executado para a a c e j de i-1 at 0. Como i varia de 1 ate m temos, pela formula da soma dos termos de uma P.A.: e
m i=1 ai

= (1 + m)

(m+1) 2

= O(m2 )

4.2

Ordenao por Seleo ca ca

A ordenaao por seleao consiste, em cada etapa, em selecionar o maior (ou o menor)elemento e c c aloc-lo em sua posiao correta dentro da futura lista ordenada. a c Durante a aplicaao do mtodo de seleao a lista com m registros ca decomposta em duas sub c e c listas, uma contendo os itens j ordenados e a outra com os restantes ainda no ordenados. No in a a a cio sub lista ordenada vazia e a outra contm todos os demais.No nal do processo a sub lista ordenada e e apresentar (m-1) itens e a outra apenas 1. a As etapas(ou varreduras) como j descrito acima consiste em buscar o maior elemento da lista no a a ordenada e coloc-lo na lista ordenada. Veja no exemplo abaixo o resultado das etapas da ordenaao a c de um vetor de inteiros: Etapa Vetor original 1 2 3 4 X[0] 5 {5 {4 {1 {1} X[1] 9 3 3 3} {3 X[2] 1 1 1} {4 4 X[3] 4 4} {5 5 5 X[4] 3 {9} 9} 9} 9}

4.2.1

Funo de Seleo(Buscando o maior elemento) ca ca

void Selecao(int m,int x[]) { int aux,j,i,maior; for(i=0;i<m-1;i++) { maior=0; for(j=0;j<m-i;j++) if (x[j] > x[maior]) maior=j; aux=x[m-i-1]; x[m-i-1]=x[maior]; x[maior]=aux; } } N mero de Comparaoes: u c A comparaao feita no loop mais interno for(j=0;im-i;j++) .Para cada valor de i so feitas (m-i) c e a comparaoes dentro do loop mais interno. Como i varia de at m-1, o numero total de comparaoes c e c para ordenar a lista toda : e
m1 i=0 (m

1) = m + (m 1) + (m 2) + ... + 1 =

m(m1) 2

= O(m2 )

4.3

Ordenao por troca - Bubble Sort ca

Um mtodo simples de ordenaao por troca a estratgia conhecida como bolha que consiste, em e c e e cada etapa borbulhar o maior elemento para o m da lista. Inicialmente percorre-se a lista dada da esquerda para a direita, comparando pares de elementos consecutivos, trocando de lugar os que esto fora da ordem.No exemplo abaixo, em cada troca, o maior elemento deslocado uma posiao a e c para a direita. Varredura 1 X[0] 10 9 9 9 X[1] 9 10 7 7 X[2] 7 7 10 6 X[3] 6 6 6 10 Troca 0e1 1e2 2e3 Fim da Varredura 1

Aps a primeira varredura o maior elemento encontra-se alocado em sua posiao denitiva na lista o c ordenada. Podemos deix-lo de lado e efetuar a segunda varredura na sub lista v[0],v[1],v[2]. Veja a a continuaao do exemplo: c Varredura 2 X[0] 9 7 7 X[1] 7 9 6 X[2] 6 6 9 X[3] 10 10 10 Troca 0e1 1e2 Fim da Varredura 2

Aps a segunda varredura o maior elemento da sub lista v[0],v[1],v[2] encontra-se alocado em sua o posiao denitiva. A prxima sub lista a ser ordenada v[0],v[1]. Veja a continuaao do exemplo: c o e c Varredura 3 X[0] 7 6 X[1] 6 7 X[2] 9 6 X[3] 10 10 Troca 0e1 Fim da Varredura 3

4.3.1

Funo Bubble Sort ca

void BubbleSort(int m,int x[]) { int aux,j,i; for(i=0;i<m-1;i++) { for(j=0;j<m-i-1;j++) if (x[j] > x[j+1]) { aux=x[j]; x[j]=x[j+1]; x[j+1]=aux; } } } N mero de Comparaoes: u c No algoritmo da bolha observamos que existem m-1 varreduras(etapas) e que em cada varredura o nmero de de comparaoes diminui de uma unidade , variando de m-1 at 1. Portanto : u c e
m1 i=1 (m

1) = (m 1) + (m 2) + ... + 1 =

m(m1) 2

= O(m2 )

4.4

Exerc cios

1. Dado o vetor ordenado v=1,5,6,7,12,17,22,45,65,98,100,120,150,200,231. Mostre passo a passo a pesquisa binria pelo elemento 100. Quantas comparaoes foram feitas? E se a pesquisa fosse a c seqencial, quantas comparaoes seriam feitas? u c R. n=15 inicio=0 inicio=8 inicio=8 inicio=10

fim=14 fim=14 fim=10 fim=10

meio=7 meio=11 meio=9 meio=10

Elem[7] = 45 Elem[11]= 120 Elem[9] = 98 Elem[10]=100

< > < -

100 100 100 Elemento Encontrado.

P.B. realizou 4 comparaoes. Uma pesquisa seqencial faria 11 comparaoes. c~ u c~ 2. Para o vetor acima, de um exemplo onde a pesquisa seqencial faria menos comparaoes que a u c pesquisa binria? R. a

Busca pelo elemento 1. n=15 inicio=0 inicio=0 inicio=0 inicio=0

fim=14 fim=6 fim=2 fim=0

meio=7 meio=3 meio=1 meio=0

Elem[7] Elem[3] Elem[1] Elem[0]

= = = =

45 7 5 1

> > > -

1 1 1 Elemento Encontrado.

PB faz 4 comparaoes e a pesquisa seqencial faz apenas uma comparaao. c~ u c~

3. Ordene o vetor v=20,12,28,05,10,18 usando o mtodo de inserao. Mostre o vetor a cada passo e c do loop. R. V V[0] 20 20 12 12 05 05 05 V[1] 12 20 20 12 10 10 V[2] 28 V[3] 05 V[4] 10 V[5] 18 i 0 1 2 3 4 5 6

28 20 12 12

28 20 18

28 20

28

4. Ordene o vetor v=20,12,28,05,10,18 usando o mtodo de seleao. Mostre o vetor a cada passo e c do loop. R. V V[0] 20 20 12 12 05 05 V[1] 12 12 05 05 10 10 V[2] 28 05 10 10 12 12 V[3] 05 10 18 18 18 18 V[4] 10 18 20 20 20 20 V[5] 18 28 28 28 28 28 i 0 1 2 3 4 5

5. Ordene o vetor v=20,12,28,05,10,18 usando o mtodo de bolha. Mostre o vetor a cada passo e do loop. R. V 1 Passo V[0] 20 12 V[1] 12 20 V[2] 28 05 V[3] 05 28 10 18 18 V[4] 10 28 28 20 20 V[5] 18 i

2 Passo 3 Passo 4 Passo

12 05

05 10

10 12

28 28 28

Bibliograa Utilizada
Apostila do prof. Flvio Keidi Miyazawa. a Paulo Feolo - Projeto de Algoritmos. dispon em: http://www.ime.usp.br/ pf/algovel ritmos Fernando Lobo. Programaao Imperativa, 2003/04. Dispon em :http://www.adeec.fct.ualg.pt/PI obo/ c vel Material dispon em: http://www.inf.pucpcaldas.br/biblioteca virtual/c/metodos de ordenacao.htm vel Material do Curso de C da UFMG - Dispon em:http://ead1.eee.ufmg.br/cursos/C/ vel

S-ar putea să vă placă și