Você está na página 1de 5

Classificao

Classificao
A classificao e a busca encontram-se entre os ingredientes mais conhecidos dos sistemas de programao. O conceito de um conjunto ordenado de elementos tem considervel impacto sobre nossa vida cotidiana. Exemplo: localizar um nmero de telefone em um catlogo. O processo de busca bastante simplificado pelo fato de que os nomes no catlogo esto listados em ordem alfabtica. Exemplo: procurar um livro numa biblioteca. Como os livros esto catalogados em uma ordem especfica cada livro recebe uma posio especfica em relao aos outros e pode ser achado num intervalo de tempo razoavelmente rpido. Em geral, um conjunto de itens classificado para produzir um relatrio ou para tornar mais eficiente o acesso da mquina aos dados. Um arquivo de tamanho n uma sequncia de n itens r[0], r[1], ..., r[n-1]. Cada item no arquivo chamado registro. Uma chave k[i], associada a cada registro r[i]. A chave geralmente um subcampo do registro inteiro. Diz-se que o arquivo est classificado pela chave se i < j implicar que k[i] precede k[j] em alguma classificao nas chaves. Exemplo: catlogo de telefones. O arquivo consiste em todas as entradas do catlogo. Cada entrada um registro. A chave pela qual o arquivo est classificado o campo nome do registro. Cada registro inclui tambm campos para um endereo e um nmero de telefone. Uma classificao considerada interna se os registros que ela classificar estiverem na memria principal, e externa se alguns dos registros que ela classificar estiverem armazenamento auxiliar. possvel que dois registros num arquivo tenham a mesma chave. Uma tcnica de classificao chamada estvel se, para todos os registros i e j, k[i] seja igual a k[j]; se r[i] precede r[j] no arquivo original, r[i] preceder r[j] no arquivo classificado. Uma classificao estvel mantm os registros com a mesma chave na mesma ordem relativa em que estavam antes da classificao. Uma classificao ocorre sobre os prprios registros ou sob re uma tabela auxiliar de ponteiros.

Nesse caso, os prprios registros foram classificados.


1

Es trutura de Dados II

Se a quantidade de dados armazenados em cada um dos registros for to grande, a sobrecarga envolvida ao movimentar os registros de fato se torna proibitiva. Nesse caso, uma tabela auxiliar de ponteiros pode ser usada de modo que esses ponteiros sejam movidos em vez dos verdadeiros dados. Chamada classificao por endereos.

A tabela posiciona no centro o arquivo. A posicionada esquerda a tabela inicial de ponteiros. Durante o processo de classificao, as entradas na tabela de ponteiros so ajustadas de modo que a tabela final fique como a que aparece posiciona direita. Nenhuma das entradas do arquivo original foi deslocada. D menos trabalho procurar determinado elemento num conjunto de elementos do que classificar primeiro o conjunto inteiro e depois extrair o elemento necessrio. Porm, se for necessrio o uso frequente do arquivo para o propsito de recuperar elementos especficos, classificar o arquivo mais eficiente. Sucessivas buscas podem ultrapassar a sobrecarga envolvida na classificao do arquivo uma s vez e na subsequente recuperao de elementos do arquivo classificado. O programador deve tomar a deciso (classificar ou no) com base e m circunstncias individuais. Ao tomara deciso de classificar, deve-se incluir o que deve ser classificado e quais mtodos sero usados. Para obtermos os dados ordenados, temos basicamente duas alternativas: Inserir os elementos na estrutura de dados respeitando a ordenao (ordenao garantida por construo). Aplicar um algoritmo para ordenar elementos a partir de um conjunto de dados j criado. Existem duas categorias gerais de algoritmos de ordenao: algoritmos que ordenam matrizes (tanto na memria como em arquivos de acesso aleatrio em disco) e algoritmos que ordenam arquivos sequenciais em disco. Existem trs mtodos gerais para ordenar matrizes: troca, seleo ou insero. Imagine as cartas de um baralho: Ordenar por troca: espalhe-as, voltadas para cima, numa mesa, ento troque as cartas fora de ordem at que todo o baralho esteja ordenado. Ordenar por seleo: espalhe as cartas na mesa, seleciona a carta de menor valor, retire-a do baralho e segure-a na mo. Esse processo continuar at que todas as cartas estejam em sua mo. As cartas em sua mo estaro ordenadas quando o processo estiver terminado.

Classificao

Ordenar por insero: segure todas as cartas em sua mo. Ponha uma carta por vez na mesa, sempre inserindo-a na posio correta. O mao estar ordenado quando no restarem mais cartas em sua mo.

Classificao por troca


Classificao por bolha

A ordenao mais conhecida (e mais difamada) a ordenao por bolha. Uma das caractersticas a sua facilidade de entender e de programar. Porm, a menos eficiente. uma ordenao por trocas, que envolve repetidas comparaes e, se necessrio, a troca de dois elementos adjacentes. Os elementos so como bolhas em um tanque dgua cada uma procura o seu prprio nvel. A idia fundamental fazer uma srie de comparaes entre os elementos do vetor. Quando dois elementos esto fora de ordem, h uma inverso e esses dois elementos so trocados de posio, ficando na ordem correta. Assim, o primeiro elemento comparado com o segundo. Se uma inverso for encontrada, a troca feita. Em seguida, independe se houve ou no troca aps a primeira comparao, o segundo elemento comparado como terceiro, e, caso uma inverso seja encontrada, a troca feita. O processo continua at que o penltimo elemento seja comparado com o ltimo. Com esse processo, garante-se que o elemento de maior valor do vetor seja levarado para a ltima posio. A ordenao continua posicionando o segundo maior elemento, o terceiro, etc., at que todo o vetor esteja ordenado. Exemplo 1: o programa seguinte ordena uma string digitada no teclado em ordem ascendente.
#include <string.h> #include <stdio.h> #include <stdlib.h> void bubble (char *item, int cont){ register int a, b; register char t; for (a = 1; a < cont; ++a) for (b = cont-1; b >= a; --b){ t = item[b -1]; item[b - 1] = item[b]; item[b] = t; } } int main (void){ char s[80]; printf("Digite uma string: "); gets(s); bubble (s, strlen(s)); printf("A string ordenada : %s.\n",s); getch(); }

No cdigo, item um ponteiro para uma matriz de caracteres a ser ordenada, e cont o nmero de elementos da matriz. A ordenao bolha dirigida por dois laos. O lao mais externo faz a matriz ser varrida cont-1 (garante que todo elemento estar na posio correta quando a funo terminar. O lao mais interno faz as comparaes e as trocas.

Es trutura de Dados II

Esse tipo de algoritmo muito ineficiente quando aplicado a um grande nmero de elementos, porque o tempo de execuo est diretamente relacionado com o nmero de comparaes e trocas. A ordenao bolha tem uma peculiaridade um elemento fora de ordem na extremidade grande ir para a posio correta em uma passo, mas um elemento desordenado na extremidade pequena subir vagarosamente para o lugar apropriado. Uma melhoria na ordenao bolha , em vez de sempre ler a matriz na mesma direo, pode-se inverter a direo entre passos subsequentes. Dessa forma, elementos muito fora do lugar iro mais rapidament para suas posies corretas. Exemplo 2: uma ordenao de bolha chamada de ordenao oscilante, faz um movimento de vaivm sobre a matriz.
#include <string.h> #include <stdio.h> #include <stdlib.h> void shaker (char *item, int cont){ register int a, b; int troca; char t; do { troca = 0; for (a = cont-1; a > 0; --a){ if (item[a-1] > item[a]){ t = item[a -1]; item[a - 1] = item[a]; item[a] = t; troca = 1; } } for (a = 1; a < cont; ++a){ if (item[a - 1] > item[a]){ t = item[a - 1]; item[a - 1] = item[a]; item[a] = t; troca = 1; } } } while (troca); } int main (void){ char s[80]; printf("Digite uma string: "); gets(s); shaker (s, strlen(s)); printf("A string ordenada : %s.\n",s); getch(); }

Exemplo 3: considere a ordenao de um vetor de valores inteiros. A cada passada exibido como ficou o vetor.
#include <stdio.h> void bolha (int cont, int *item){ register int i, j; for (i = cont -1; i >= 1; i--) for (j=0; j < i; j++) if (item[j] > item[j+1]){ int t = item[j]; 4

Classificao item[j] = item[j+1]; item[j+1] = t; for (i = 0; i < 8; i++) printf("%d ",item[i]); printf("\n"); } } int main (void){ int i; int v[8] = {25,48,37,12,57,86,33,92}; bolha(8,v); printf("Vetor ordenado: "); for (i = 0; i < 8; i++) printf("%d ",v[i]); printf("\n"); getch(); return 0; }

Exerccios:
1. Um arquivo deve ser classificado ou no? Justifique. 2. Considerando aspectos como tempo que ser gasto pelo programador ao codificar determinado programa de classificao, tempo de mquina necessrio para executar o programa e o espao necessrio para o programa, faa uma pesquisa sobre os mtodos de classificao mais eficientes. 3. Altere o exemplo 3, para evitar que o processo continue depois de o vetor estar ordenado. Interrompendo o processo quando houve uma passagem inteira sem trocas

Você também pode gostar