Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar
Publicado por Edmar Wantuil (última atualização em 26/10/2011)
[ Hits: 6.850 ]
Homepage: wantuil.com
Escrevi esse script em meu primeiro período na faculdade, com o objetivo de melhorar minha lógica. Acredito que só tenha utilidade acadêmica. O script recebe 10 números e o salvo em um vetor, ele o organiza utilizando somente o vetor de 10 posições não usando variáveis para contagem ou para auxiliar a troca de posição.
program orde;
{
Feito por Edmar Wantuil Silva Júnior
Em 2009
Programa recebe 10 números e coloca em ordem crescente, sem usar variáveis para contagem ou auxilio
Lembrando que assim esse algoritmo poupa o uso da memória ram, mas infelizmente faz maior uso do processador,
ou seja esse algoritmo é melhor executado em redes por poupar algumas transferências desnecessárias, já para execução
local o melhor que consegui foi usar apenas duas variáveis para contagem.
Existe alguns BUGS como o de números negativos que fica ao contrario, mas esse algoritmo é apenas para
testar a possibilidade de colocar um vetor em ordem seja ela crescente ou decrescente, mudando de uma
para outra apenas mudando de < para > ou virse-versa no if do segundo while, usando somente o vetor que
recebera os números sem aumentar o numero de posições ou usar variáveis para auxilio.}
uses crt;
var
{Um único vetor de 10 posições}
num: array[1..10] of integer;
begin
num[10]:= num[10] + 1;
{Recebe numero no vetor ate a posição 9, com contagem na posição 10}
while 10 > num[10] do
begin
write('Entre com o numero do indice ', num[10],': ');
readln(num[(num[10])]);
{Multiplica o numero por 100 para ganhar duas casas decimais}
num[num[10]]:= num[num[10]] * 100;
num[10]:= num[10] + 1;
end;
{Recebe o numero na posição 10}
write('Entre com o numero do indice 10: ');
readln(num[10]);
num[10]:= num[10] * 100;
{
Começa a contagem usando a primeira e a ultima posição para contagem 1 e 10,
elas são mais indicadas para isso devido a suas distancias evitando possíveis BUGS
causados pelo colisão dos contadores
}
num[ 1]:= num[ 1] + 1;
num[10]:= num[10] + 1;
{Tira o MOD de 100 da posição 10 pra deixar apenas a contagem}
while 11 > (num[10] mod 100) do
begin
while 10 > (num[ 1] mod 100) do
{Roda o algoritimo 9 vezes * 10 vezes da contagem anterior roda 90 vezes}
begin
if (num[(num[ 1] mod 100)]) > (num[(num[ 1] mod 100) + 1]) then
begin
{Nesse momento o numero muda de posição 'se verdade' sem usar variável auxiliar baseado em
X:= X + Y
Y:= X - Y
X:= X - Y}
{Soma as duas posições salvado o resultado no primeiro}
num[(num[ 1] mod 100) ]:= num[num[ 1] mod 100] + num[(num[ 1] mod 100) + 1];
{Esse 'se' preserva o contador salvo na ultima posição, tirando o DIV DE 100,
para trabalhar apenas com o valor de entrada do usuário, posteriormente multiplica
100 e soma o contador se a contagem estiver em 9}
if 9 = (num[ 1] mod 100) then
num[(num[ 1] mod 100) + 1]:= ((((num[num[ 1] mod 100]) div 100) - ((num[(num[ 1] mod 100) + 1]) div 100)) * 100) + ((num[(num[ 1] mod 100) + 1]) mod 100)
else
num[(num[ 1] mod 100) + 1]:= ((((num[num[ 1] mod 100]) div 100) - ((num[(num[ 1] mod 100) + 1]) div 100)) * 100);
{Esse 'se' faz o mesmo que o ultimo mas salva a contagem salva na primeira
posição se a contagem e estiver em 1}
if 1 = (num[ 1] mod 100) then
num[(num[ 1] mod 100) ]:= ((((num[num[ 1] mod 100]) div 100) - ((num[(num[ 1] mod 100) + 1]) div 100)) * 100) + (num[(num [ 1] mod 100)] mod 100)
else
num[(num[ 1] mod 100) ]:= ((((num[num[ 1] mod 100]) div 100) - ((num[(num[ 1] mod 100) + 1]) div 100)) * 100);
end;
num[ 1]:= num[ 1] + 1;
end;
num[ 1]:= num[ 1] - 9;
num[10]:= num[10] + 1;
end;
num[10]:= num[10] - 10;
{Volta os números originais e os exibe na tela, menos o numero salvo na ultima posição,
pois esse será usado para contagem}
while 10 > (num[10] mod 100) do
begin
num[(num[10] mod 100)]:= num[(num[10] mod 100)] div 100;
write(num[(num[10] mod 100)],' ');
num[10]:= num[10] + 1;
end;
{Volta ao original e exige o numero do indice 10}
num[10]:= num[10] div 100;
write(num[10]);
readkey;
end.
Tocador de Vídeo no Lazarus(Player de Vídeo)
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Ativando e usando "zoom" no ambiente Cinnamon
Vídeo Nostálgico de Instalação do Conectiva Linux 9
Como realizar um ataque de força bruta para desobrir senhas?
Queda no serviços da Cloudflare, alguns sites estão fora do ar. (1)
Perfil criado no samba ad dc não loga no Windows 10 e 11 (11)









