1.2. ORDENAÇÃO POR SELEÇÃO
A estratégia básica desse método é, em cada fase, selecionar um menor item
ainda não ordenado e permutá-lo com aquele que ocupa a sua posição na
seqüência ordenada. Mais precisamente, isso pode ser descrito assim: para
ordenar uma seqüência ai, ai+1, …, an, selecione uma valor k tal que ak =
min{ ai, ai+1, …, an}, permute os elementos ai e ak e, se i+1<n, repita o procedimento
para ordenar a subseqüência ai+1, …, an.
2 A complexidade determina a eficiência do método; quanto maior for a taxa de crescimento
da função, menos eficiente é o método.
4
Exemplo 1.4. Ordenação da seqüência 46, 55, 59, 14, 38, 27 usando seleção.
Fase i k a1 a2 a3 a4 a5 a6
1o 1 4 46 55 59 14 38 27
2o 2 6 14 55 59 46 38 27
3o 3 5 14 27 59 46 38 55
4o 4 4 14 27 38 46 59 55
5o 5 6 14 27 38 46 59 55
14 27 38 46 55 59
Note que, em cada fase, um valor apropriado para k é escolhido e os itens ai
e ak são permutados. Particularmente na 4o fase, como os valores de i e k são
iguais, a permutação não seria necessária.
O que ainda não está muito claro é como o valor k é escolhido em cada fase.
Para isso, vamos codificar a função selmin(v, i, n), que devolve a posição de
um item mínimo dentro da seqüência vi, vi+1, …, vn. A estratégia adotada
supõe que o item vi é o mínimo e então o compara com vi+1, vi+2, … até que
não haja mais itens ou então que um item menor que vk seja encontrado.
Nesse caso, vk passa a ser o mínimo e o processo continua analogamente.
Exemplo 1.5. Selecionando um item mínimo numa seqüência.
k j v1 v2 v3 v4 v5 v6
1 1 46 55 59 14 38 27
1 2 46 55 59 14 38 27
1 3 46 55 59 14 38 27
4 4 46 55 59 14 38 27
4 5 46 55 59 14 38 27
4 − 46 55 59 14 38 27
Inicialmente, o item v1 é assumido como o mínimo (k=1). Então v1 é comparado
aos demais itens da seqüência até que v4 é encontrado. Como v4 < v1, o
item v4 passa a ser o mínimo (k=4) e o processo continua analogamente.
Exemplo 1.6. Selecionando um item mínimo.
function selmin(var v:vetor; i:integer) : integer;
var j, k : integer;
begin
k:=i;
for j:=i+1 to max do
if v[k]>v[j] then k:=j;
selmin := k;
end;
Silvio Lago 5
Exemplo 1.7. Ordenação por seleção: selection sort.
procedure ssort(var v:vetor);
var i, k, x : integer;
begin
for i:=1 to max-1 do
begin
k := selmin(v,i);
x := v[i];
v[i] := v[k];
v[k] := x;
end;
end;
Análise da ordenação por seleção
Analisando a rotina ssort(), constatamos que ela realiza o mesmo número de
comparações que a rotina bsort(), ou seja, (n−1)+(n−2)+ ?+2+1 = ½(n2−n).
Logo, a sua complexidade de tempo também é O(n2). Entretanto, como a subseqüência
a ordenar diminui de um item a cada troca feita, temos que o número
máximo de trocas3 na ssort() é n−1; um número consideravelmente
menor do que aquele encontrado para a rotina bsort(). Podemos dizer que o
número de trocas na bsort() é O(n2), enquanto na ssort() é O(n).