Você está na página 1de 10

Estrutura de Dados

5. Ordenação e Pesquisa
A ordenação facilita o acesso aos dados. Quando recebemos um conjunto de dados desordenados,
devemos realizar sobre eles um pré-processamento de forma a classificá-los. Muitas vezes necessitamos
organizar uma estrutura de dados para facilitar a pesquisa. Para alcançarmos um dado armazenado na
estrutura, também temos que usar métodos de pesquisa (busca) eficientes. Neste tópico iremos tratar
métodos clássicos de ordenar uma lista desordenada implementada com vetores e métodos de pesquisa
para buscas em uma lista estática ordenada.

Ordenação

Os métodos de ordenação de dados realizam classificações segundo uma chave de ordenação. Nesta
chave, especifica-se o tipo de ordem que queremos dar aos dados (crescente, decrescente, etc.) e o campo
da estrutura que será afetado (campo nome, campo matrícula, etc.). Tipos de métodos de ordenação:

 Por troca: são baseados na troca de posição dos dados, de forma a ordená-los.
 Por seleção:parte do princípio de realizar o isolamento de elementos para posições
ordenadas.
 Por inserção: baseiam-se no deslocamento de elementos da estrutura frente a um elemento
de busca.
Imagine as cartas de um baralho:

 Para ordenar as cartas utilizando troca, espalhe-as voltadas para cima e então troque as
cartas fora de ordem até que todo baralho esteja ordenado;
 Utilizando seleção, espalhe as cartas na mesa, selecione a carta de menor valor, retire-a do
baralho e coloque-a na mão. O processo continua e termina quando todas as cartas
estiverem na sua mão;
 Para ordenar as cartas por inserção, segure todas as cartas na mão. Ponha uma carta por vez
na mesa, sempre a inserindo na posição correta.

Método da Ordenação por Troca

Método da Bolha(bubble sort): esse metodo é muito simples de implementar, no entando é um


dos piores métodos de ordenção quando se fala de desempenho. Ela envolve repetidas comparações e, se
necessário, a troca de dois elementos adjacentes.

A figura a seguir mostra o que acontece com o vetor no decorrer da execução do método da bolha.
76
Estrutura de Dados

Método da Ordenação por Seleção


Este método procura o menor elemento do vetor e coloca na primeira posição. A seguir, procura o
menor elemento do vetor a partir do segundo elemento e coloca na segunda posição do vetor. Continua o
processo até que existam apenas os dois últimos elementos do vetor para serem comparados.

77
Estrutura de Dados
A figura a seguir mostra o que acontece com o vetor no decorrer da execução do método de
ordenação por seleção.

78
Estrutura de Dados

Método da Ordenação por Inserção

Inserção Direta: Neste método, considera-se o segmento já ordenado como sendo formado pelo
primeiro elemento do vetor de chaves. Os demais elementos, ou seja do 2º ao último, pertencem ao
segmento não ordenado. A partir desta situação inicial, toma-se um a um dos elementos não ordenados, a
partir do primeiro e, por busca seqüencial realizada no segmento já ordenado, localiza-se a sua posição
relativa correta. Após a inserção, a fronteira entre os dois segmentos é deslocada uma posição para a
direita, indicando, com isto, que o segmento ordenado ganhou um elemento e o não ordenado perdeu um.
O processo prossegue até que todos os elementos do segundo segmento tenham sido inseridos no
primeiro. A figura a seguir mostra o que acontece com o vetor no decorrer da execução deste método.

79
Estrutura de Dados

Pesquisa
Busca de dados dentro de um conjunto. A Busca seqüencial procura do primeiro ao último
elemento do vetor até encontrar o elemento. Método mais simples, já utilizado nos nossos programas. A
Busca Binária é o método aplicado para conjunto de dados ordenados. Muito parecido com o método que
usamos quando desejamos procurar um número numa lista telefônica.

Programa que implementa os métodos de ordenação e pesquisa

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
// Programa para executar metodos de ordenação numa lista desordenada
// estatica

typedef struct { int mat;


char nome[31], sit;
float nota1, nota2, media;
}alunos;
alunos turma[30];
float soma;
int qa, ap,rp,op;

void linha()
{ int i;
for (i=1;i<=80;i++)
printf("_");
printf("\n");
}

void cabec()
{ system("cls");
printf("Ordenacao e Pesquisa\n");linha();
}

//Inserir novo aluno


void inserir()
{ int cont;
do{ cabec();
printf("\n\nInserir Novo Aluno\n\n");
printf("\n\tNumero de Matricula do Aluno: ");
scanf("%d",&turma[qa].mat);
printf("\n\tNome: ");
fflush(stdin);
gets(turma[qa].nome);
printf("\n\tNota 1: ");
scanf("%f",&turma[qa].nota1);
printf("\n\tNota 2: ");
scanf("%f",&turma[qa].nota2);

80
Estrutura de Dados
turma[qa].media= (turma[qa].nota1+turma[qa].nota2)/2;
soma += turma[qa].media;
if (turma[qa].media>=6)
{ turma[qa].sit= 'A';
ap++;
}
else
{ turma[qa].sit= 'R';
rp++;
}
qa++;
printf("\n\n\tAluno Inserido com Sucesso!!!\n\n");
printf("\n\n\tContinuar inserindo aluno (1-sim/2-nao)? ");
scanf("%d",&cont);
}while (cont == 1);
}

//Metodo de ordenação da Bolha


void bolha()
{ int i, fim, troquei;
alunos aux;
fim = qa-1;
do {
troquei = 0;
for (i=0; i<=fim-1; i++)
{
if (turma[i].mat > turma[i+1].mat)
{ aux = turma[i];
turma[i] = turma[i+1];
turma[i+1] = aux;
troquei = 1;
}
}
fim--;
} while (troquei ==1);
printf("\n\n Ordenacao pelo metodo da Bolha\n\n");
printf("\n\n Vetor Ordenado com Sucesso!!!\n\n");
getche();
}

//Metodo de ordenação por Inserção


void insercao()
{ int i, k;
alunos aux;
for (i=1; i<=qa-1; i++)
{ k=i;
aux = turma[i];
while ((k>0)&&(aux.mat<turma[k-1].mat))
{ turma[k] = turma[k-1];
k--;
}
turma[k]=aux;
}
printf("\n\n Ordenacao pelo metodo da Insercao\n\n");
81
Estrutura de Dados
printf("\n\n Vetor Ordenado com Sucesso!!!\n\n");
getche();
}

//Metodo de ordenação por Seleção


void selecao()
{ int i,k,pmenor;
alunos aux;
for (i=0; i<=qa-2; i++)
{
pmenor = i;
for (k=i+1; k<=qa-1; k++)
{ if (turma[k].mat < turma[pmenor].mat)
pmenor = k;
}
if (i!=pmenor)
{ aux = turma[i];
turma[i] = turma[pmenor];
turma[pmenor] = aux;
}
}
printf("\n\n Ordenacao pelo metodo da Selecao\n\n");
printf("\n\n Vetor Ordenado com Sucesso!!!\n\n");
getche();
}

// Metodos de Busca com para listas ordenadas

//Metodo de busca binaria


void binaria()
{ int matcon, achou, continuar, inicio, fim, meio;
alunos aux;
do{ cabec();
printf("\n\nConsultar Aluno - Busca Sequencial\n\n");
printf("\n\tNumero de Matricula do Aluno: ");
scanf("%d",&matcon);
achou = 0;
inicio = 0;
fim = qa-1;
while (inicio<=fim)
{
meio = (inicio + fim)/2;
printf("\nmeio = %d\n\n",meio);
if (turma[meio].mat == matcon)
{ printf("\nMat Aluno Nota1 Nota2 Media Sit");
printf("\n ------------------------------------------------ ");
printf("\n%2d %-20s %5.2f %5.2f %5.2f %c",
turma[meio].mat, turma[meio].nome, turma[meio].nota1,
turma[meio].nota2, turma[meio].media, turma[meio].sit);
printf("\n ------------------------------------------------ ");
achou = 1;
break;
}

82
Estrutura de Dados
if (matcon >turma[meio].mat)
inicio = meio +1;
else
fim = meio -1;
}
if (achou == 0)
printf("\n\n\tNumero de Matricula Incorreto!!!!!!\n\n");
printf("\n\n\tContinuar consultando aluno(1-sim/2-nao)? ");
scanf("%d",&continuar);
}while (continuar == 1);
}

//Metodo de busca sequencial


void sequencial()
{ int i, matcon, achou, continuar;
do{ cabec();
printf("\n\nConsultar Aluno - Busca Sequencial\n\n");
printf("\n\tNumero de Matricula do Aluno: ");
scanf("%d",&matcon);
achou = -1;
for(i = 0; i<qa; i++)
{ if (matcon==turma[i].mat)
{ achou = i;
break;
}
else
{ if (matcon<turma[i].mat)
break;
}
}
if (achou!=-1)
{ printf("\nMat Aluno Nota1 Nota2 Media Sit");
printf("\n ------------------------------------------------ ");
printf("\n%2d %-20s %5.2f %5.2f %5.2f %c",
turma[achou].mat,turma[achou].nome, turma[achou].nota1,
turma[achou].nota2,turma[achou].media,turma[achou].sit);
printf("\n ------------------------------------------------ ");
}
else
printf("\n\n\tNumero de Matricula Incorreto!!!!!!\n\n");
printf("\n\n\tContinuar consultando aluno(1-sim/2-nao)? ");
scanf("%d",&continuar);
}while (continuar == 1);
}

//Imprimir relatorio com as informaçoes de todos alunos


void listagem()
{ int i;
cabec();
printf("\n\nRelatorio Geral\n");
printf("\nMat Aluno Nota1 Nota2 Media Sit");
printf("\n ---------------------------------------------------------- ");
for(i = 0; i < qa; i++)
printf("\n%2d %-20s %5.2f %5.2f %5.2f %c",turma[i].mat,
83
Estrutura de Dados

turma[i].nome, turma[i].nota1, turma[i].nota2, turma[i].media,


turma[i].sit);
printf("\n ---------------------------------------------------------- ");
printf("\n\nMedia da turma = %.2f",soma/qa);
printf("\n\nQuantidade de aprovados = %d",ap);
printf("\n\nQuantidade de reprovados = %d",rp);
printf("\n\n\tDigite qualquer tecla para sair\n\n\n ");
getche();
}

//Programa principal
main()
{ op = 1;
soma = 0;
ap = rp = qa =0;
while (op != 0)
{ cabec();
printf("Opcoes: \n\n");
printf(" 1- Inserir Aluno\n\n");
printf(" 2- Ordenacao Bolha\n\n");
printf(" 3- Ordenacao por Selecao\n\n");
printf(" 4- Ordenacao por Insercao\n\n");
printf(" 5- Busca Sequencial\n\n");
printf(" 6- Busca Binaria\n\n");
printf(" 7- Listagem\n\n");
printf(" 0- Sair do Programa\n");
linha();
printf(" Informe a Opcao desejada: ");
scanf("%d",&op);
switch(op)
{ case 1: inserir(); break;
case 2: bolha(); break;
case 3: selecao(); break;
case 4: insercao(); break;
case 5: sequencial(); break;
case 6: binaria(); break;
case 7: listagem(); break;
case 0: break;
default: printf("\nOpcao Invalida!!!!"); getche();break;
}
}
}

84
ALGORITMOS DE ORDENAÇÃO
Comparações

Lista dos Algoritmos de ordenação

Você também pode gostar