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.607 ]

Homepage: wantuil.com

Download ordena.pas




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.

  



Esconder código-fonte

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.

Scripts recomendados

Estrutura de dados - pilha

Arvore Binaria de Pesquisa

Árvore binária

Controle de video locadoras

Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts