Algoritmos de Ordenação em Delphi: Seleção e Intercalação
Método de Ordenação por Seleção
Código do procedimento de ordenação por seleção (Selection Sort) implementado no evento do botão:
procedure TForm1.Button2Click(Sender: TObject);
var
i, j, eleito, posi, aux, menor: integer;
begin
// Este procedimento vai executar o método de ordenação por seleção
// poslivre = 0 - vetor vazio
// poslivre = 1 - vetor com dados
if poslivre = 0 then
ShowMessage('O vetor está vazio, é necessário digitar os números no botão Carregar')
else
begin
for i := 1 to 9 do
begin
eleito := vet[i];
posi := i + 1;
menor := vet[i + 1];
for j := i + 1 to 10 do
begin
if vet[j] < menor then
begin
menor := vet[j];
posi := j;
end;
end;
if vet[i] > menor then
begin
aux := vet[i];
vet[i] := menor;
vet[posi] := aux;
end;
end;
ListBox1.Items.Add('');
ListBox1.Items.Add('');
ListBox1.Items.Add('Vetor ORDENADO POR SELEÇÃO');
ListBox1.Items.Add('');
for i := 1 to 10 do
ListBox1.Items.Add('Posição: ' + IntToStr(i) + ' Valor: ' + IntToStr(vet[i]));
poslivre := 0;
end;
end;Método de Ordenação por Intercalação
Declaração de variáveis globais e procedimento de ordenação por intercalação (Merge Sort):
var
vet: array[1..10] of integer;
vet1, vet2: array[1..5] of integer;
poslivre: integer;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j, k, eleito, posi, aux: integer;
begin
if poslivre = 0 then
ShowMessage('O vetor está vazio, é necessário digitar os números no botão Carregar')
else
begin
// O vetor digitado será particionado em dois subvetores
// j - índice do subvetor 1
j := 1;
// k - índice do subvetor 2
k := 1;
for i := 1 to 10 do
begin
if i <= 5 then
begin
vet1[j] := vet[i];
j := j + 1;
end
else
begin
vet2[k] := vet[i];
k := k + 1;
end;
end;
// Ordenando o subvetor 1 pelo método da ordenação por troca
for i := 1 to 4 do
begin
for j := 1 to 4 do
begin
if vet1[j] > vet1[j + 1] then
begin
aux := vet1[j];
vet1[j] := vet1[j + 1];
vet1[j + 1] := aux;
end;
end;
end;
// Ordenando o subvetor 2 pelo método da ordenação por troca
for i := 6 to 9 do
begin
for k := 1 to 4 do
begin
if vet2[k] > vet2[k + 1] then
begin
aux := vet2[k];
vet2[k] := vet2[k + 1];
vet2[k + 1] := aux;
end;
end;
end;
// O laço abaixo vai intercalar os dois subvetores gerando o vetor ordenado que possui 10 posições
// j - índice do subvetor 1 (j = 1 para que a primeira posição do subvetor 1 seja analisada)
j := 1;
// k - índice do subvetor 2 (k = 1 para que a primeira posição do subvetor 2 seja analisada)
k := 1;
for i := 1 to 10 do
begin
if j = 6 then
begin
// Todos os números do subvetor 1 já foram colocados no vetor resultante, logo, sobram apenas números do subvetor 2
vet[i] := vet2[k];
k := k + 1;
end
else if k = 6 then
begin
// Todos os números do subvetor 2 já foram colocados no vetor resultante, logo, sobram apenas números do subvetor 1
vet[i] := vet1[j];
j := j + 1;
end
else if vet1[j] <= vet2[k] then
begin
// Ainda existem números nos dois subvetores para serem colocados no vetor resultante
// Neste caso, o número analisado no subvetor 1 é menor ou igual ao número analisado no subvetor 2
// Logo, o número do subvetor 1 será colocado no vetor resultante
vet[i] := vet1[j];
j := j + 1;
end
else
begin
// Ainda existem números nos dois subvetores para serem colocados no vetor resultante
// Neste caso, o número analisado no subvetor 2 é menor que o número analisado no subvetor 1
// E será colocado no vetor resultante
vet[i] := vet2[k];
k := k + 1;
end;
end;
// As linhas abaixo irão mostrar os números da tela com o vetor ordenado
poslivre := 0;
end;
end;