Ir ao conteúdo

Merge Sort


Bellator

Posts recomendados

Postado

Estou tentando implementar o Merge Sorte (Ordenação por intercalação) no pascal, mas não tive muito sucesso, em algumas situações ele da certo, em outras não, por exemplo: seu eu entro com 12 - 3 - 5 - 1 - 8 e 11, o programa ordena, mas se eu digitar por exemplo 12 - 3 - 5 - 1 - 8 - 11 - 15 - 28, dá erro.

A implementação é a seguinte (Sei que é meio complicado, mas se tiver uma alma caridosa que possa me ajudar, eu agradeço) :

program mergesort;

uses crt;

const max=50;

type vetori = array[1..max] of integer;

procedure intercala(var v:vetori; ini, meio, fim:integer);

var a:vetori;

i, j, k, res:integer;

begin

i:=ini; res:=ini; j:=meio+1;

while (i<=meio) and (j<=fim) do

begin

if v<=v[j] then

begin

a[res]:=v;

inc(i);

end

else

begin

a[res]:=v[j];

inc(j);

end;

inc(res);

end;

if (i>meio) then

begin

for k:=j to meio do

begin

a[res]:=v[k];

inc(res);

end;

end

else

begin

for k:=i to meio do

begin

a[res]:=v[k];

inc(res);

end;

for k:=ini to fim do

begin

v[k]:=a[k];

end;

end;

end;

procedure merge_sort(var v:vetori; ini, fim:integer);

var meio:integer;

begin

if ini<>fim then

begin

meio:=(ini+fim) div 2;

merge_sort(v,ini,meio);

merge_sort(v,meio+1,fim);

intercala(v,ini,meio,fim);

end;

end;

var n,i,ini,meio, fim:integer;

v:vetori;

Begin

clrscr;

writeln('Entre com o numero de elementos do vetor: ');

readln(n);

ini:=1;fim:=n;

for i:=1 to n do

begin

writeln('Vetor [',i,']: ');

readln(v);

end;

merge_sort(v,ini,fim);

for i:=1 to n do

writeln('Vetor [',i,']: ',v);

readkey;

End.

Postado

Esqueci um detalhe, o programa estava originalmente em C++, como segue:

Implementação em C

Void merge (int M[5o], int inicio, int fim)

{

int meio;

comparações[3]++;

if (inicio < fim)

{

meio = ((inicio + fim)/2);

merge (M, inicio, meio);

merge (M, meio+1, fim);

intercala (M, inicio, meio, fim);

}

}

void intercala (int M[50], int inicio, int fim)

{

int primeiro, res, segundo, k;

int C[]50;

primeiro = res = inicio;

segundo = meio + 1;

while (primeiro <= meio && segundo <= fim)

{

comparacoes[3]++;

if (M[primeiro] <= M[segundo])

{

atribuicoes [3]++;

C[res]= M[primeiro];

primeiro++;

}

else

{

atribuicoes[3]++;

C[res] = M[segundo];

segundo++;

}

res++;

}

comparacoes[3]++;

if (primeiro > meio)

for (k=segundo; k<=meio; k++)

{

atribuicoes[3]++;

C[res] = M[k];

res++;

}

else

for (k=primeiro; k<=meio; k++)

{

atribuicoes[3]++;

C[res] = M[k];

res++;

}

for (k=inicio; k<=fim; k++)

M[k] = C[k];

}

http://w3.ualg.pt/~hshah/ped/Aula%2014/merge_final.html

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!