Este documento descreve e compara vários algoritmos de ordenação, incluindo seleção direta, bolha, inserção e quicksort. Fornece pseudocódigos destes algoritmos em Pascal e explica como cada um funciona através de exemplos. Além disso, discute as vantagens e desvantagens de cada método de ordenação.
1. CENTRO UNIVERSITÁRIO CARIOCA
Curso de Graduação em Ciência da Computação
Sandro Marcelo Arpi
Igor Cavalcante de Souza
Victor Hugo Mendes Alves
Métodos de Pesquisa e Ordenação
Seleção Direta (Selection Sort)
Rio de Janeiro
2014
2. Página | 2
Sumário
Definição .....................................................................................................................3
Algoritmo em Pascal de ordenação por seleção (selection sort).................................4
Detalhamento do Algoritmo.........................................................................................5
Algoritmo em Pascal de ordenação Bubble Sort.........................................................7
Algoritmo de ordenação por inserção (Insertion Sort).................................................8
Exemplos.....................................................................................................................9
Aplicabilidade ............................................................................................................10
Comparando com outros métodos de ordenação .....................................................10
Conclusão .................................................................................................................12
Bibliografia:................................................................................................................13
3. Página | 3
Definição
Ordenação por Seleção (Selection Sort)
Ordenação é o processo de arranjar um conjunto de informações semelhantes em
uma ordem crescente ou decrescente. Especificamente, dada uma lista ordenada i
de n elementos, então: i1 <= i2 <= ... <= in.
É também um requisito para a maioria das aplicações, sejam elas locais ou web. É
necessário ordenar para que possa se ter acesso de forma mais fácil à informação
desejada.
Os métodos de ordenação são classificados em dois grandes grupos. Se o arquivo a
ser ordenado cabe todo na memória principal, então o método de ordenação é
chamado de ordenação interna. Neste caso o número de registros a ser ordenado é
pequeno o bastante para caber em um array do Pascal. Se o arquivo a ser ordenado
não cabe na memória principal e, por isso, tem que ser armazenado em disco, então
o método de ordenação é chamado de ordenação externa. A principal diferença
entre os dois métodos é que, em um método de ordenação interna, qualquer registro
pode ser imediatamente acessado, enquanto, em um método de ordenação externa,
os registros são acessados sequencialmente ou em grandes blocos.
Existem alguns algoritmos de ordenação, como o bubble sort, quick sort, merge sort,
heap sort, inserção direta ou insertion sort e seleção direta ou selection sort.
O método de ordenação por seleção caracteriza-se por procurar, a cada iteração, a
chave de menor (ou maior) valor do vetor e colocá-la na sua posição definitiva
correta, qual seja, no início (ou no final) do vetor, por troca com a que ocupa aquela
posição. O vetor a ser ordenado passa a ter um elemento a menos para ser usado
nas comparações. O mesmo processo é repetido para a parte restante do vetor, até
que este fique reduzido a um único elemento, quando então estará ordenado. Os
métodos de ordenação diferenciam-se uns dos outros, pelo critério utilizado para
4. Página | 4
selecionar, a cada iteração, a chave de menor (ou maior) valor. Os algoritmos de
ordenação por seleção utilizam uma pesquisa sequencial
Algoritmo em Pascal de ordenação por seleção (selection sort)
Program SelectionSort ;
var
x: array[1..10] of integer;
i,j,eleito,menor,posi: integer;
Begin
for i:=1 to 10 do
begin
write('Digite o ',i,' numero: ');
readln(x[i]);
end;
for i:=1 to 9 do
begin
eleito:= x[i];
menor:= x[i+1];
posi:= i+1;
for j:=i+1 to 10 do
if (x[j] < menor) then
begin
menor:= x[j];
posi:= j;
end;
if (menor < eleito) then
begin
x[i]:= x[posi];
x[posi]:= eleito;
end;
end;
writeln();
for i:=1 to 10 do
writeln(i,' numero: ', x[i]);
End.
5. Página | 5
Detalhamento do Algoritmo
Como funciona o método de ordenação por seleção direta?
Bem, pegamos cada elemento do vetor e comparamos com os demais elementos,
Ao encontrarmos o menor (ou maior) valor, efetuamos a troca de posições entre
eles, ou seja:
1° criamos um for com um índice de 1 até n para preencher o vetor
for i:=1 to 10 do
begin
write('Digite o ',i,' numero: ');
readln(x[i]);
end;
2° criamos outro for para compararmos os elementos da posição (índice) 1 até a
posição n-1 com as demais posições do vetor
3° pegamos o elemento do índice do vetor e separamos (no caso do algoritmo
abaixo, consideramos ele como o eleito)
4° atribuímos o valor na variável “menor”, do índice + 1
5° variável para a troca de posição recebe índice + 1
for i:=1 to 9 do
begin
eleito:= x[i];
menor:= x[i+1];
posi:= i+1;
6° Após atribuir valores para as variáveis que vão fazer com que a comparação e a
troca de posição aconteçam, executaremos outro for começando do índice + 1 (que
será atribuído à variável j) até n, para achar o menor valor entre os elementos que
estão a direita do eleito.
7° para acharmos o menor valor, teremos que ter uma condição dentro desse for,
para que haja a comparação entre os elementos e dessa comparação se encontre o
menor valor.
8° após encontrarmos esse valor, atribuímos ele a variável “menor” e informamos
qual a posição dele no vetor.
6. Página | 6
for j:=i+1 to 10 do
if (x[j] < menor) then
begin
menor:= x[j];
posi:= j;
end;
9° finalmente o comparamos com o valor que estava reservado na variável “eleito”, e
se esse valor for menor que o valor do eleito, efetuamos a troca de posições
10° ao final da execução, imprimimos o vetor ordenado pelo método de ordenação
por seleção direta.
if (menor < eleito) then
begin
x[i]:= x[posi];
x[posi]:= eleito;
end;
end;
writeln();
for i:=1 to 10 do
writeln(i,' numero: ', x[i]);
End.
Resumindo fica assim:
Procurar o menor elemento e trocar com o elemento na primeira posição.
Procurar o segundo menor elemento e trocar com o elemento na segunda
posição.
Proceder assim até a ordenação estar completa.
7. Página | 7
Algoritmo em Pascal de ordenação Bubble Sort
Program BubbleSort ;
var
x: array[1..10] of integer;
n,i,aux: integer;
Begin
for i:=1 to 10 do
begin
write('Digite o ',i,' numero: ');
readln(x[i]);
end;
for n:=1 to 10 do
for i:=1 to 9 do
if (x[i] > x[i+1]) then
begin
aux:= x[i];
x[i]:= x[i+1];
x[i+1]:= aux;
end;
writeln();
for i:=1 to 10 do
writeln(i, ' numero: ', x[i]);
End.
8. Página | 8
Algoritmo de ordenação por inserção (Insertion Sort)
Program InsertionSort ;
var
x: array[1..10] of integer;
i,j,eleito: integer;
Begin
for i:=1 to 10 do
begin
write('Digite o ',i,' numero: ');
readln(x[i]);
end;
for i:=2 to 10 do
begin
eleito:= x[i];
j:= i-1;
while (j>=1) and (x[j]>eleito) do
begin
x[j+1]:= x[j];
j:= j-1;
end;
x[j+1]:= eleito;
end;
writeln();
for i:=1 to 10 do
writeln(i,' numero: ', x[i]);
End.
10. Página | 10
Aplicabilidade
É um algoritmo de simples implementação. Pelo fato do método varrer todas as
posições de uma lista repetidamente, sua melhor aplicabilidade é em pequenos
conjuntos de dados.
Comparando com outros métodos de ordenação
Seleção Direta
Prós:
Por ser um algoritmo de ordenação de local, não precisa de armazenamento
temporário além do necessário para guardar a lista original. Pouco uso de memória.
Contras:
A quantidade de comparações efetuadas é constante para um dado n, ou seja, não
depende do arranjo prévio das chaves. Mesmo que os itens estejam ordenados, o
algoritmo fará todo o processo item a item. Por isso baixa eficiência em listas
grandes
Já o número de trocas de itens mínimos durante a busca da menor chave em cada
iteração não é constante, pois depende da ordem em que as chaves se apresentam.
Este fato vai fazer com que os tempos de classificação de dois vetores com as
mesmas chaves, porém arranjadas de formas diversas, possam ser diferentes. O
seu desempenho é facilmente influenciado pela ordem inicial dos itens antes do
processo de triagem.
Inserção Direta (Insertion Sort) Consiste em percorrer uma lista de
elementos da esquerda para a direita e à medida que se avança os elementos mais
à esquerda vão sendo ordenados. É como se o elemento a ser analisado fosse
‘inserido’ no local correto da lista movimentando os demais elementos para a direita.
11. Página | 11
Prós:
Funciona melhor quando o vetor está “quase” ordenado.
É um bom método quando se deseja adicionar uns poucos itens a um arquivo já
ordenado e depois obter um outro arquivo ordenado.
O método de ordenação por inserção é estável, pois ele deixa os registros com
chaves iguais na mesma posição relativa.
Contras:
Quando o vetor está muito desordenado, a quantidade de trocas é muito grande,
sendo mais eficaz nesse caso, a ordenação por seleção direta. A situação mais
desfavorável para o método é aquela em que o vetor a ser ordenado se apresenta
na ordem contrária à desejada.
Quicksort É o algoritmo de ordenação interna mais rápido que se conhece para
uma ampla variedade de situações, sendo provavelmente mais utilizado do que
qualquer outro algoritmo. Funciona particionando o vetor a ser ordenado em dois
menores. Os vetores menores são ordenados independentemente e depois os
resultados são combinados para produzir a solução do vetor maior.
Prós:
Velocidade da ordenação. Já que a maioria das aplicações visa um excelente
desempenho, esse é o algoritmo ideal para a maioria das situações.
Contras:
Processo de particionamento que é complicado.
Ineficiência para arquivos já ordenados.
Bubble Sort Ordena por par de chaves e já na primeira varredura, o elemento de
maior valor estará ordenado em sua posição final. Entretanto, a cada varredura
diminui-se uma chave a ser comparada. A denominação deste método resulta da
associação das chaves com bolhas dentro de um fluido. Cada bolha teria um
diâmetro proporcional ao valor de uma chave. Assim, as bolhas maiores subiriam
12. Página | 12
mais depressa, o que faria com que, após certo tempo, elas se arranjassem em
ordem de tamanho.
Prós:
Funciona muito bem em vetores previamente ordenados.
Contras:
O algoritmo de ordenação Bubble Sort é um método simples de ordenação por troca.
Sua popularidade vem do seu nome fácil e de sua simplicidade. Porém, é uma das
piores ordenações já concebidas. Ela envolve repetidas comparações e, se
necessário, a troca de dois elementos adjacentes Tem seu pior desempenho em
vetores contrários a ordenação.
Conclusão
Existem métodos de ordenação que são diferentes na sua implementação, mas
cada modelo de algoritmo vai ser ideal dependendo da situação que se encontra o
vetor a ser ordenado. Todos têm seus prós e contras, e todos funcionam bem. A
vantagem da ordenação por seleção direta está na simplicidade do seu algoritmo e
na quantidade mínima de trocas. Existem várias razões para se ordenar uma
sequência, uma delas é a possibilidade se acessar seus dados de modo mais
eficiente.
13. Página | 13
Bibliografia
Estrutura de Dados - Algoritmos, análise da complexidade e implementações
em Java e C/C++ Ana Fernandes Gomes Ascencio e Graziela Santos Araújo.
Páginas 21 a 89.
Projeto de Algoritmos com implementações em PASCAL e C - Nivio Ziviani.
Páginas 101 a 157.
Programação Estrutura de Dados e Algoritmos em C - Professor Doutor António
Manuel Adrego da Rocha – Páginas 171 à 208.
Estrutura de Dados - Algoritmos de Ordenação - Prof. Othon M. N. Batista
UFSC-CTC-INE - Estruturas de Dados - Ordenação de Dados - Prof. Ronaldo S.
Mello
Algoritmos e Estruturas de Dados I - Marcos Castilho, Fabiano Silva e Daniel
Weingaertner (apostila).
Algoritmos e Estrutura de Dados II - Leandro Rosniak Tibola (apostila).
Estrutura de Dados com Algoritmos e C - Marcos Laureano.