Algoritmos de Ordenação
●
Problema: encontrar um número de telefone em
uma lista telefônica


●
simplificado pelo fato dos nomes estarem em ordem
alfabética
e se estivesse sem uma ordem?
Problema: busca de um livro em uma biblioteca

a cada livro é atribuída uma posição relativa a outros
e portanto pode ser recuperado em um tempo hábil
Algoritmos de Ordenação
Terminologia básica
 seqüência de n ítens ou elementos
(registros)
●

r[0], r[1], ……….r[n-1]
a chave a[i] está associada ao elemento r[i]
●
●
usualmente a chave é um campo do registro
os elementos estão classificados pela chave
se i < j então a[i] precede a[j]
Terminologia básica
●
●
●
a ordenação tem por objetivo rearrumar as chaves de
forma que obedeçam a uma regra (ex.: ordem
numérica ou alfabética)
se os elementos representam registros de um arquivo,
sendo representado por uma lista sequencial em
memória principal
 a ordenação é interna
se o arquivo estiver em memória secundária
 a ordenação é externa
Terminologia básica
●
●
a ordenação pode ser por : contiguidade
física, valor indireto de ordenação e
encadeamento
os algoritmos podem operar sobre o elemento
ou sobre uma tabela de ponteiros


registro é muito grande: ordenação indireta
os registros não são rearrumados e sim os índices

●
●
Contiguidade física:
Existe uma forte característica física no
processo de ordenação,
Os elementos de um registro são
movimentados de sua posição física
original para sua nova posição

●
●
●
Vetor indireto de ordenação:
Não há movimentação das entradas das
posições originais.
A classificação é realizada com o apoio
de um arquivo-índice.
É esse arquivo que contém
apontadores para os registros reais, os
quais são mantidos classificados

●
●
●
●
Encadeamento:
Também não há a movimentação dos
registros das posições originais.
A ordem desejada é conseguida pelo
uso de uma lista ligada.
Coloca-se um campo a mais na tabela
para permitir que o próximo registro seja
identificado.
É necessário utilizar um ponteiro para o
primeiro elemento da lista ligada
Principais Métodos de
Ordenação Interna
●
Ordenação por inserção:


●
Ordenação por troca


●
Inserção direta
Incrementos decrescentes (shell sort)
Método da bolha ( buble sort)
Método da troca e partição ( quicksort)
Ordenação por seleção


Seleção direta
Seleção em árvore (heapsort)
Método da bolha - Bubble Sort
●
●
●
Em cada passo cada elemento é comparado
com o próximo
Se o elemento estiver fora de ordem a troca é
realizada
Realizam-se tantos passos quantos forem
necessários até que não ocorram mais trocas
Bubble Sort
2 6 3 5 7 9
2 6 3 5 7 9
2 3 6 5 7 9
2 3 5 6 7 9
2 3 5 6 7 9
Bubble Sort
2 3 5 6 7 9
2 3 5 6 7 9
2 3 5 6 7 9
●
Não ocorreram trocas
Bubble Sort
BUBBLESORT (V[], n)
houveTroca = verdadeiro
enquanto houveTroca for verdadeiro faça
houveTroca = falso
para i de 1 até n-1 faça
se V[i] > V[i + 1]
então troque V[i] e V[i + 1] de lugar e
houveTroca = verdadeiro
void bubble(int v[], int qtd)
{
int i, aux;
int trocou;
trocou = 1;
while (trocou)
{
qtd--;
trocou = 0;
for(i = 0; i < qtd; i++)
if(v[i] > v[i + 1])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
trocou = 1;
}
}
}
Ordenação por Seleção
●
Um dos algoritmos de classificação mais
simples:



ache primeiro o menor elemento da lista e
troque sua posição com o primeiro elemento
ache o segundo menor elemento e troque
sua posição com o segundo elemento
continue até que toda lista esteja ordenada
●
para cada i de 0 a n-2, troca o menor elemento
da sub-lista que vai de i a N-1 com a[i]
Ordenação por Seleção
inicial
9 2 6 3 5 7
2 9 6 3 5 7
2 3 6 9 5 7
Cada passo
acha o menor
e o coloca em
sua posição
2 3 5 9 6 7
2 3 5 6 9 7
2 3 5 6 7 9
void selectionSort(int vetor[],int tam)
{
int i,j;
int min,aux;
for (i=0;i<tam-2;i++)
{
min=i;
for (j=i+1;j<tam-1;j++)
{
if (vetor[j]<vetor[min])
min=j;
}
aux=vetor[i];
vetor[i]=vetor[min];
vetor[min]=aux;
}
}
Ordenação por Inserção Direta
●
●
●
Um primeiro elemento está no vetor ordenado
e os demais no vetor desordenado
Retira-se o primeiro elemento do vetor
desordenado. Ao colocá-lo no vetor ordenado,
é realizada a devida comparação para inserilo na sua posição correta
Repete-se o processo até que todos os
elementos do vetor desordenado tenham
passado para o vetor ordenado
Inserção Direta
6| 3
3 6|
3 4
3 4
3 4
3 4
4
4
6|
5
5
5
59 8
59 8
5 98
6|98
69|8
6 8 9|
Inserção Direta
InsertionSort(V, n)
for j← 2 to n do
aux ← V[j]
► insere V[j] na parte ordenada
V[1..j-1]
i←j–1
while i > 0 e V[i] > aux do
V[i + 1] ← V[i]
i←i–1
V[i + 1] ← aux
void insertSort(int a[], int length)
{
int i, j, value;
for(i = 1; i < length; ++i)
{
value = a[i];
for (j = i - 1; j >= 0 && a[j] > value; --j)
a[j + 1] = a[j];
a[j+1] = value;
}
}
Download

3 - Objetivo Sorocaba