Você está na página 1de 4

CLASSIFICAO E PESQUISA

Mtodos de Ordenao
Ordenar corresponde ao processo de rearranjar um conjunto de objetos em uma
ordem ascendente ou descendente, com o objetivo de facilitar a recuperao posterior de
alguma informao do conjunto ordenado. A ordenao a base na qual muitos algoritmos
so construdos. Entendendo-a, tem-se conhecimento para resolver outros problemas. A
ordenao aparece em muitos problemas na prtica, e o problema mais estudado em
Cincia da Computao. Provavelmente devido aos computadores gastarem mais tempo
ordenando do que fazendo qualquer outra coisa.
Os principais algoritmos de ordenao podem ser classificados em:
Ordenao por insero
- Insero direta
- Incremento decrescente (Shell sort)
Ordenao por troca
- Mtodo da bolha (bubble sort)
- Mtodo da troca e partio (quicksort)
Ordenao por seleo
- Seleo direta
- Seleo em rvore (heapsort)
Ordenao por intercalao
- MergeSort
Ordenao por Insero
Esse algoritmo bastante simples e eficiente para uma quantidade pequena de
elementos. A idia de funcionamento semelhante ao ordenamento de cartas de baralho na
mo de um jogador. A mo esquerda comea "vazia" e a mo direita insere uma "carta" de
cada vez na posio correta. Ao final, quando todas as "cartas" foram inseridas, elas j esto
ordenadas. Para encontrar, durante a insero, a posio correta para um valor, compara-se
este valor um-a-um com as cartas j na mo esquerda, at encontrarmos a posio correta.
Possui baixa eficincia.
Nesse mtodo o vetor a ser ordenado dividido em dois segmentos: o primeiro com
os elementos j ordenado e o seguinte com o restante dos elementos ainda no ordenados.
Algoritmo:
- o primeiro elemento considerado no primeiro segmento (o j ordenado);
- retirar o primeiro elemento do segmento desordenado e inseri-lo no segmento
ordenado, j na sua devida posio;
- repetir o processo para todos os elementos do vetor.
Neste algoritmo no h necessidade de utilizao de nenhuma estrutura de dados extra,
alm do prprio vetor inicial com os valores. Considere que os nmeros a serem ordenados
esto armazenados num vetor. O algoritmo de ordenao por insero tem complexidade
proporcional a n2 no pior caso, onde n o nmero de elementos a serem ordenados.
O algoritmo de ordenao por seleo (negrito) apresentado no cdigo em C
abaixo.

#include <stdio.h>
#include <stdlib.h>
#define TAM 6
int ord_insercao ( int v[TAM]){
int i, j, x;
for (j = 1; j < TAM; j++) {
x = v[j];
for (i = j-1; i >= 0 && v[i] > x; --i)
v[i+1] = v[i];
v[i+1] = x;
}
}
void main(){
int vetor[TAM], i, N, aux, pos;
for(i=0;i<TAM;i++)
aux=rand();
pos=ord_insercao (vetor);
}
Exemplo: Ordenar o vetor A = {5,2,4,6,1,3}. (Cormen, 2001)
0

5 2 4 6 1 3
0

2 5 4 6 1 3
0

2 4 5 6 1 3
0

2 4 5 6 1 3
0

1 2 4 5 6 3
0

1 2 3 4 5 6

Exerccios:
1. Usando a algoritmo de ordenao por insero, ilustre a ordenao no vetor = {31, 41,
59, 26, 41, 58}. (Cormen, 2001) Quantas trocas foram efetuadas?
2. Reescreva o procedimento de ordenao por insero para ordenar em ordem
decrescente, em vez da ordem crescente. (Cormen, 2001)
ShellSort
O mtodo de ordenao ShellSort, ou Ordenao por Diminuio de Elementos, foi
inventando por Donald Shell em 1959. O algoritmo realiza a ordenao passando vrias
vezes pelo vetor dividindo em vetores cada vez menores, e ao fim nos menores vetores
aplicado o mtodo de ordenao por insero.
Este algoritmo baseado em trocas. O algoritmo usa uma varivel auxiliar
denominada distncia de comparao (h). O valor de h inicializado com um valor
prximo de n/2. A troca feita entre elementos que esto distanciados h posies (e
estiverem fora de ordem). Aps de fazer todas as trocas de elementos cuja distancia h, o
valor h deve ser reduzido:
h = h/2 ou h = h/3
O algoritmo repetido at que a distncia de comparao h seja igual a um (h = 1). Para h =
1 (ultima passada) executado o algoritmo de insero.
#include <stdio.h>
#include <stdlib.h>
#define TAM 6
int Shell_Sort( int V[TAM]) {
int j, i, h, x;
for ( h = TAM/2; h >=1; h =h/2) {
for ( i = h; i < TAM; i++) {
x = V[i];
for ( j = i; j >= h; j =j-h) {
if ( V[j - h] > x)
V[j] = V[j-h];
else
break;
}
V[j] = x;
}
}
}
main(){
int vetor[TAM], i, N, aux, pos;
for(i=0;i<TAM;i++)
aux=rand();
Shell_Sort (vetor); }

Exemplo: Ordenar o vetor A = {5,2,4,6,1,3}.


0

5 2 4 6 1 3
0

5 2 4 6 1 3
0

5 1 4 6 2 3
0

5 1 3 6 2 4
0

1 5 3 6 2 4
0

1 3 5 6 2 4
0

1 3 5 6 2 4
0

1 2 3 5 6 4
0

1 2 3 4 5 6
Exerccios
3. Usando a algoritmo de ordenao por insero, ilustre a ordenao no vetor = {31, 41,
59, 26, 41, 58}. Quantas trocas foram efetuadas?
4. Reescreva o procedimento de ordenao por insero para ordenar em ordem
decrescente, em vez da ordem crescente. (Cormen, 2001)