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.601 ]
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)
Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta