You are on page 1of 23

UNIVERSIDADE ESTADUAL DE SANTA CRUZ - UESC

PESQUISA E ORDENAO DE VETORES


CET077

Professor Edgar Alexander


Primeiro semestre de 2011

Mtodos de Pesquisa em Vetores

a forma atravs da qual possvel localizar um elemento em um vetor.


Pesquisa

Seqencial ou Pesquisa Linear Pesquisa Binria

Pesquisa Seqencial

o mtodo mais direto de encontrar um elemento particular num vetor no classificado.


Apesar de simples o mtodo menos eficiente. Mas o nico mtodo capaz de encontrar informaes em uma matriz desordenada.

Busca Sequencial - Algoritmo


#include <stdio.h> #include <string.h> Int busca (char *item, int cont, char chave) { int i; for (i=0; i<cont; i++) { if (chave == item[ i ]) { return ( i+1 ); } } return ( 0 ); // no encontrou }

Cont.
// programa utilizando busca void main(void) { int achou; char matriz[5] = {a, u,l,a,\0};

achou = busca(matriz, 5, l); if (achou) { printf (O %c o %d elemento da lista, matriz[achou-1], achou); } else { printf (No foi encontrado o elemento procurado); }
}

Pesquisa Sequencial

Gasta-se em mdia n/2 comparaes para encontrar um elemento particular em um vetor contendo n elemento.
O pior caso requer n comparaes. Mtodo muito pouco eficiente

Pesquisa Binria

a forma mais eficiente de encontrar uma informao em uma matriz, mas requer que a matriz esteja ordenada. O mtodo utiliza a abordagem dividir e conquistar
Formulao do algoritmo geral:
1.
2. 3.
1. 2.

Repetir at o passo 3 enquanto o intervalo de pesquisa no ficar vazio. Obter a posio do elemento central no intervalo atual de pesquisa Se o valor do elemento desejado igual ao do elemento central, ento a pesquisa bem sucedida.
Se o valor do elemento desejado menor do que o valor do elemento central, ento reduza o intervalo de pesquisa primeira metade do intervalo anterior; caso contrario reduza o intervalo de pesquisa a segunda metade do intervalo anterior

4.

Pesquisa malsucedida.

Pesquisa Binria - Algoritmo


int busca_binaria(char *item, int cont, char chave) { int ini, meio, fim; ini = 0; fim = cont-1; while (ini <= fim) { meio = (ini + fim) / 2; if (chave < item[meio]) { fim =meio 1; } else if (chave > item[meio])

{
else { }

ini = meio + 1;
return (meio);

}
}

return 1;

Pesquisa Binria - Algoritmo


void main(void) { int achou; char matriz[5] = {'a', 'b','c','d','e'};

achou = busca_binaria(matriz, 5, 'd'); if (achou) { printf ("O %c o %d elemento da lista\n", matriz[achou], achou+1); } else { printf ("No foi encontrado o elemento procurado"); }
}

Ordenao de Vetores

Os mtodos de ordenao de vetores podem ser classificados em 3 principais categorias:


Ordenao

por insero Ordenao por seleo Ordenao por troca

Ordenao por insero direta

Em cada passo, iniciando se com o segundo elemento, i=1, e incrementando-se i de uma em uma unidade, o i-simo elemento da seqncia vai sendo retirado e transferido para a seqncia destino, e inserido na posio apropriada
Para i=1 ate n-1 faa
x <- a[i] Inserir x no local adequado em a0 ... ai
Por exemplo, para a matriz dcab Inicial Passo 1 Passo 2 Passo 3 dcab cdab acdb abcd

Fim-para

Em C
#include <stdio.h> #include <string.h> // Ordenao por insero void ordena(char *item, int count) { int a, b; char t; for (a=1; a<count; a++) // Para o vetor inteiro { t= item[a]; // t o elemento que vai ser posicionado for(b=a-1; b>=0 && t< item[b]; b--) { item[b+1] = item[b]; } item[b+1] = t; } }

void main() { char pal[200]; printf ("\ndigite uma palavra: "); gets (pal); ordena(pal, strlen(pal)); printf ("\n%s ",pal); }

caractersticas da ordenao por insero:


O

nmero de comparaes que ocorrem durante a ordenao depende de como a lista est inicialmente ordenada.
Lista

Ordenada N de comparaes = n-1 Lista Fora de Ordem N de comparaes = (n2 + n) Caso mdio (n2 + n)

Ordenao por seleo

Lgica da ordenao:
Selecionar o elemento que apresenta a chave de menor valor Troc-lo com o primeiro elemento da seqncia a0. Repetir estas operaes envolvendo agora apenas os n-1 elementos restantes depois dos n-2 elementos, etc., at restar s um elemento, o maior deles.

Algoritmo
Exemplo: matriz bdac Inicial Passo 1 Passo 2 Passo 3 bdac adbc abdc abcd

Para i=0 at n-2 faa Guarda o ndice do menor elemento de a0 ... an em k; Trocar a0 com ak Fim-para

Em C
void ordenaS (char *item, int count) { int a,b,c; int troca; char t; for (a=0; a<count-1; a++) { troca = 0; c = a; t = item[a]; for (b=a+1; b<count; b++) { if (item[b] < t) { c = b; t = item [b]; troca = 1; } } if (troca) { item[c] = item[a]; item[a] = t; } }
}

Ordenao por troca

A principal caracterstica do processo de ordenao por troca a troca entre dois elementos do vetor. Mtodo Bolha (bubblesort) No mtodo bolha efetua-se varreduras repetidas sobre o vetor, deslocando a cada passo, para a sua extremidade esquerda, o menor dos elementos do conjunto que restou

Algoritmo

Para i=1 ate n faa // incrementando de 1 Para j=n ate i faa // decrementando de 1 Se a[j-1] > a[j] ento x = a[j-1] a[j-1] = a[ j ] a[ j ] = x fim-se fim-para fim-para

Exemplo: matriz bdac Inicial Passo 1 Passo 2 Passo 3 dcab adcb abdc abcd

Exemplo
Ordenar a palavra: CAFETBZ
CAFETBZ CAFEBTZ CAFBETZ CABFETZ

ACBFETZ

ACBEFTZ ABCEFTZ

Ordenao por troca

Apresenta-se em mdia como o pior dentre os trs algoritmos de ordenao direta.

Em C - Mtodo Bolha (bubblesort)


void bolha (char *item, int count) { int a,b; char t; for (a=1; a<count; a++) { for (b=count-1; b >=a; b--) { if( item[b-1] > item[b]) { t = item[b-1]; item[b-1] = item [b]; item[b] = t; } } } }

Mtodo Bolha (bubblesort)


Este algoritmo sugere alguns aperfeioamentos. Uma tcnica bvia para melhorar consiste em manter uma indicao informando se houve ou no a ocorrncia de uma troca, para determinar precocemente o termino do algoritmo. Outra melhoria seria, no apenas guardar a informao da ocorrncia de troca, mas a posio da ltima permuta realizada.

Ordenao por Particionamento


Mtodo Quicksort

Quicksort considerado o melhor algoritmo de propsito geral disponvel atualmente.

baseado na idia de parties.


Seleciona-se um elemento chamado comparando Faz se a partio da matriz em duas sees: uma com os elementos menores que o comparando e uma com os elementos maiores ou iguais que o comparando. Repete-se este processo para cada seo at que a matriz esteja ordenada.

O processo essencialmente recursivo por natureza, de modo que a forma mais clara de implementar o algoritmo atravs de algoritmos recursivos.

Em C (Quicksort)
void quick(char *item, int count) { qs(item, 0, count-1); }

void qs (char *item, int esq, int dir) { int i, j; char x, y;


i= esq; j= dir; x = item[(esq + dir) / 2]; do { while (item[i] < x && i < dir) i++; while (x < item[j] && j > esq) j--; if (i <= j) { y = item [i]; item[i] = item[j]; item[j] = y; i++; j--; } } while (i <=j); if (esq < j) qs(item, esq, j); if (i < dir) qs(item, i, dir); }

You might also like