[R-br] "Ordenação Mergesort"

Benilton Carvalho beniltoncarvalho em gmail.com
Quinta Março 14 13:12:49 BRT 2013


Pela "cara" do codigo, tudo o que vc precisa e' separar o codigo em
duas funcoes... veja no que eu te mandei, que o mergesort chama ele
proprio... e a ultima coisa e' fazer a ordenacao.

Em 14 de março de 2013 12:37, Jackeline Bonetti Campos
<jackebcampos em hotmail.com> escreveu:
> Olá Elias.
> É o merge sort.
>
> Benilton Carvalho,obrigada!
> Vou olhar a sua implementação.
> Não mandei o código inteiro. Somente a parte que está dando erro.
>
> Segue abaixo o código todo:
>
>  mergesort=function(x){ # Função que irá quebrar a entrada ao meio cada vez
> que for acionada
>         semisort=function(y,z){ #Função que vai juntando ordenadamente as
> partes da entrada
>                 resultado=NULL
>                 while(length(y)>0 & length(z)>0){ # Enquanto tiver elemento
> nos dois subvetores
>                         if(y[1]<=z[1]){ # se o primeiro elemento do subvetor
> a esquerda for menor que o primeiro elemento do subvetor a direita
>                                 resultado=c(resultado,y[1])
>                                 y=y[-1] # Tira o primeiro elemento do vetor,
> já que ele já foi adicionado ao resultado
>                         }
>                         else{
>                                 resultado=c(resultado,z[1])
>                                 z=z[-1]
>                         }
>                 }
>                 if(length(y)>0){ # A partir do momento que acaba os
> elementos em uma das metades, me resta "copiar" o que sobrou  da outra
> metade
>                         resultado=c(resultado,y)
>                 }
>                 if(length(z)>0){
>                         resultado=c(resultado,z)
>                 }
>                 return(resultado) # Retorna o resultado ordenado
>         }
>         tamanho=length(x) # Se a entrada tiver mais de um elemento, o
> algoritmo irá "quebrar" a entrada ao "meio" para ordenar individualmente
> cada entrada e depois juntar as metades já ordenadas
>         if(tamanho>1){
>                 meio= tamanho/2
>                 esq=x[1:floor(meio)]
>                 dit=x[floor(meio+1):tamanho]
>                 esq=mergesort(esq)
>                 dit=mergesort(dit)
>                 if(esq[length(esq)]<=dit[1]){
>                         return(c(esq,dit))
>                 }
>                 else{
>                         semisort(esq,dit)
>                 }
>         }
>         else{ # Se a entrada for um unico elemento, a ordenação dela é
> trivial
>                 return(x)
>         }
> }
>
> Att,
> Jackeline.
>
>
>> From: eliaskrainski em yahoo.com.br
>> To: r-br em listas.c3sl.ufpr.br
>> Date: Thu, 14 Mar 2013 16:27:03 +0100
>> Subject: Re: [R-br] "Ordenação Mergesort"
>
>>
>> Curiosidade: Esse algoritmo e' o quick sort?
>>
>>
>> _______________________________________________
>> R-br mailing list
>> R-br em listas.c3sl.ufpr.br
>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>> código mínimo reproduzível.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código
> mínimo reproduzível.


Mais detalhes sobre a lista de discussão R-br