Você está na página 1de 31

MC102 - Algoritmos e programao de computadores ca

Aula 16: Busca e Ordenao em ca vetores

Busca
Dada uma coleo de n elementos, pretende-se saber se um ca determinado elemento valor est presente nessa coleo. a ca Para efeitos prticos, vamos supor que essa coleo a ca e implementada como sendo um vetor de n elementos inteiros: vetor[0]..vetor[n-1].

Pesquisa seqencial u
Uma soluo poss percorrer o vetor desde a primeira ca vel e posio at a ultima. Para cada posio i, comparamos ca e ca vetor[i] com valor. Se forem iguais dizemos que valor existe. Se chegarmos ao m do vetor sem sucesso dizemos que valor no existe. a

Pesquisa seqencial u
1o passo inicializao ca i = 0; encontrado = 0; /*Falso*/

Pesquisa seqencial u
2o passo pesquisa while (i < TAMANHO && !encontrado) { if (vetor[i] == valor) { encontrado = 1; /*Verdadeiro*/ } else { i++; } }

Pesquisa seqencial u
3o passo tratamento do resultado if (encontrado) { printf ("Valor %d est na posicao %d\n", a vetor[i], i); } else { printf ("Valor %d n~o encontrado\n", a valor); } Ver mais detalhes em sequencial.c

Pesquisa seqencial u
Quanto tempo este algoritmo demora a executar? Em outras palavras, quantas vezes a comparao ca valor == vetor[i] executada? e

Pesquisa seqencial u
caso valor no esteja presente no vetor, n vezes. a caso valor esteja presente no vetor, 1 vez no melhor caso (valor est na primeira posio). a ca n vezes no pior caso (valor est na ultima posio). a ca n vezes no caso mdio. e 2 Veja exemplos em seq-random.c e seq-random2.c

Pesquisa binria a
Vamos supor agora que o vetor inicial estava ordenado por ordem crescente (se fosse por ordem decrescente o racioc era semelhante). Ser que poss resolver o nio a e vel problema de modo mais eciente?

Pesquisa binria a
Caso a lista esteja ordenada, sabemos que, para qualquer i e j, i < j, se, e somente se, A[i] A[j]. Portanto, comparando um determinado elemento com o elemento procurado, saberemos se o elemento procurado o elemento comparado, e se ele est antes do elemento comparado ou a se est depois. a

Pesquisa binria a
Se zermos isso sempre com o elemento do meio da lista, a cada comparao dividiremos a lista em duas, ca reduzindo nosso tempo de pesquisa. Se em um determinado momento o vetor, aps o sucessivas divises, tiver tamanho zero, ento o o a elemento no est no vetor. a a Ver mais detalhes em binaria.c

Pesquisa binria a
Quanto tempo o algoritmo de busca binria demora a a executar? Por outras palavras, quantas vezes a comparao ca valor == vetor[i] executada? e

Pesquisa binria a
caso valor no exista no vetor, log2 (n) vezes. a caso valor exista no vetor, 1 vez no melhor caso (valor a mediana do vetor). e log2 (n) vezes no caso mdio. e Veja exemplos em bin-random.c

Qual dos dois algoritmos melhor? e


Para n = 1000, o algoritmo de pesquisa seqencial ir u a executar 1000 comparaoes no pior caso, 500 operaoes c c no caso mdio. e Por sua vez, o algoritmo de pesquisa binria ir executar a a 10 comparaoes no pior caso, para o mesmo n. O c 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.

Qual dos dois algoritmos melhor? e


O algoritmo de pesquisa binria assume que o vetor est a a ordenado. Ordenar um vetor tambm tem um custo, e superior ao custo da pesquisa seqencial. u Se for para fazer uma s pesquisa, no vale a pena o a ordenar o vetor. Por outro lado, se pretendermos fazer muitos pesquisas, o esforo da ordenao j poder valer c ca a a a pena.

Ordenao ca
Dada uma coleo de n elementos, representada em um ca vetor de 0 a n-1, deseja-se obter uma outra coleo, cujos ca elementos estejam ordenados segundo algum critrio de e comparao entre os elementos. ca

Ordenao por insero ca ca


A proposta da ordenao por insero : ca ca e

Para cada elemento do vetor faa: c insira-o na sua posio correspondente; ca

Ordenao por insero ca ca


Durante o processo de ordenao por insero a lista ca ca ca dividida em duas sub-listas, uma com os elementos j a ordenados e a outra com elementos ainda por ordenar. No in cio, a sub-lista ordenada formada trivialmente e apenas pelo primeiro elemento da lista. Nos mtodos de ordenao por insero, a cada etapa i, e ca ca o i-simo elemento inserido em seu lugar apropriado e e entre os i 1 elementos j ordenados. Os a ndices dos itens a serem inseridos variam 2 a tamanho.

Ordenao por insero ca ca


Varredura Vetor original 1 2 3 4 V[0] V[1] 9 {8 {7 {6 {5 8 9} 8 7 6 V[2] V[3] 7 {7 9} 8 7 6 6 {6 9} 8 V[4] 5 5} 5} {5} 9}

Veja mais detalhes em insercao.c

Ordenao por insero ca ca


Em cada etapa i so executadas no mximo, i comparaoes a a c pois o loop interno executado para j de i 1 at 0. Como e e i varia de 0 at tamanho 1, o nmero total de e u comparaoes para ordenar a lista toda da ordem de c e tamanho2 .

Ordenao por seleo ca ca


A ordenao por seleo consiste, em cada etapa, em ca ca selecionar o maior (ou o menor) elemento e aloc-lo em sua a posio correta dentro da futura lista ordenada. ca

Ordenao por seleo ca ca


Durante a aplicao do mtodo de seleo a lista com m ca e ca registros ca decomposta em duas sub-listas, uma contendo os itens j ordenados e a outra com os a restantes ainda no ordenados. No in a sub-lista a cio ordenada vazia e a outra contm todos os demais. No e e nal do processo a sub-lista ordenada apresentar a tamanho 1 itens e a outra apenas 1. Cada etapa (ou varredura) como j descrito acima a consiste em buscar o maior elemento da lista no a ordenada e coloc-lo na lista ordenada. a

Ordenao por seleo ca ca


Etapa Vetor original 1 2 3 4 V[0] V[1] 5 {5 {4 {1 {1} 9 3 3 3} {3 V[2] V[3] 1 1 1} {4 4 4 4} {5 5 5 V[4] 3 {9} 9} 9} 9}

Veja mais detalhes em selecao.c

Ordenao por seleo ca ca


A comparao feita no loop mais interno. Para cada valor ca e de i so feitas tamanho i comparaoes dentro do loop a c mais interno. Como i varia de 0 at tamanho 1, o e nmero total de comparaoes para ordenar a lista toda , u c e novamente, da ordem de tamanho2 .

Ordenao por bolha ca


Um mtodo simples de ordenao por troca a estratgia e ca e e conhecida como bolha que consiste, em 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 a abaixo, em cada troca, o maior elemento deslocado uma e posio para a direita. ca

Ordenao por bolha ca


Varredura 1 V[0] V[1] 10 9 9 9 9 10 7 7 V[2] V[3] 7 7 10 6 6 6 6 10 Troca V[0] e V[1] V[1] e V[2] V[2] e V[3] Fim da Varredura 1

Ordenao por bolha ca


Aps a primeira varredura o maior elemento encontra-se o alocado em sua posio denitiva na lista ordenada. ca Podemos deix-lo de lado e efetuar a segunda varredura na a sub-lista V[0],V[1],V[2]. Veja a continuao do exemplo: ca

Ordenao por bolha ca


Varredura 2 V[0] V[1] 9 7 7 7 9 6 V[2] V[3] 6 6 9 10 10 10 Troca V[0] e V[1] V[1] e V[2] Fim da Varredura 2

Ordenao por bolha ca


Aps a segunda varredura o maior elemento da sub-lista o V[0],V[1],V[2] encontra-se alocado em sua posio ca denitiva. A prxima sub-lista a ser ordenada V[0],V[1]. o e Veja a continuao do exemplo: ca

Ordenao por bolha ca


Varredura 3 V[0] V[1] 7 6 6 7 V[2] V[3] 9 6 10 10 Troca V[0] e V[1] Fim da Varredura 3

Veja mais detalhes em bubble.c

Ordenao por bolha ca


No algoritmo da bolha observamos que existem tamanho 1 varreduras (etapas) e que em cada varredura o nmero de de comparaoes diminui de uma unidade, u c variando de tamanho 1 at 1. Portanto, para ordenar a e lista toda novamente precisamos de aproximadamente c tamanho2 comparaoes.

Você também pode gostar