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

Benilton Carvalho beniltoncarvalho em gmail.com
Quinta Março 14 10:58:36 BRT 2013


seu codigo nao e' reproduzivel...

e num momento de autruismo saiu o codigo abaixo:


merger <- function(left, right){
  res <- rep(NA, length(left)+length(right))
  i <- 1
  while (length(left) > 0 | length(right) > 0){
    if (length(left) > 0 & length(right) > 0){
      if (left[1] <= right[1]){
        res[i] <- left[1]
        left <- left[-1]
      } else {
        res[i] <- right[1]
        right <- right[-1]
      }
    } else if (length(left) > 0){
      res[i] <- left[1]
      left <- left[-1]
    } else if (length(right) > 0){
      res[i] <- right[1]
      right <- right[-1]
    }
    i <- i+1
  }
  return(res)
}

mergesort <- function(vec){
  if (length(vec) <= 1) return(vec)
  mid <- ceiling(length(vec)/2)
  left <- vec[1:mid]
  right <- vec[-(1:mid)]
  left <- mergesort(left)
  right <- mergesort(right)
  return(merger(left, right))
}


Em 13 de março de 2013 20:19, Jackeline Bonetti Campos
<jackebcampos em hotmail.com> escreveu:
> Olá!
> Procurei no fórum e não encontrei nenhum post a respeito desse tipo de
> ordenação.
> Esse algorítimo quebra o vetor de tamanho n em subvetores e se chama
> recursivamente até que os subvetores tenham tamanho 1.
> Depois, compara dois subvetores colando na posição 1 o subvetor menor e na
> posição 2 o subvetor maior.
> E depois volta a comparar os subvetores à direita e à esquerda até ter o
> vetor original ordenado.
>
> Estou implementando esse algoritmo porém, não estou conseguindo dividir o
> vetor até que length seja = 1.
>
> mergesort=function(x){ # Função que irá dividir o subvetor ao meio
>         subsort=function(y,z){ #Função que vai juntando ordenadamente as
> partes da entrada
>                 resultado=NULL
>
> tam=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= tam/2
>                 esq=c[1:flor(meio)]
>                 dit=c[(meio+1):tam]
>                 esq=mergesort(esq) #vou ter que ficar aplicando o mergesort
> até o vetor da esquerda ter um elemento.
>                 dit=mergesort(dit) #vou ter que ficar aplicando o mergesort
> até o vetor da direita ter um elemento
>                 if(esq[length(esq)]<=dit[1])  #se o vetor da esquerda do
> tamanho da esquerda (que deve ser um) for menor ou igual a 1
>                 {
>                         return(c(esq,dit))      #na hora de juntar o
> subvetor da esquerda fica primeiro.
>                 }
>                 else
>                 {
>                         subsort(esq,dit) #subsort é o vetor temporário.
>                 }
>         }
>         else  # Se a entrada for um único elemento não existe ordenação. Se
> TAM<1. devolve o elemento.
>         {
>                 return(x)
>         }
>
>
> Obrigada!
>
> Att,
> Jackeline
>
> _______________________________________________
> 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