2017-07-01 7 views
0

私はRでマージソートを書いています。私は2つの関数を持っています。最初はmergelist()mergesortでの比較の数R

mergelist <- function(a, b) 
{ 
    al <- length(a$data) 
    bl <- length(b$data)   
    r <- numeric(al + bl) 
    numberOfComparisions <-0 
    ai <- 1 
    bi <- 1 
    j <- 1 

    while((ai <= al) && (bi <= bl)) 
    { 
     if(a$data[ai]<b$data[bi]) 
     { 
      r[j] <- a$data[ai] 
      ai <- ai + 1 
      numberOfComparisions = numberOfComparisions + 1 
     } 
     else 
     { 
      r[j] <- b$data[bi] 
      bi <- bi + 1  
      numberOfComparisions = numberOfComparisions + 1 
     }  
     j <- j + 1 
    } 
    if(ai<=al) 
    r[j:(al+bl)] <- a$data[ai:al]  
    else if(bi <= bl) 
    r[j:(al+bl)] <- b$data[bi:bl]  

    returnList <- list(number=numberOfComparisions + a$number + b$number , data = r) 
    return(returnList) 
} 

である。この方法は、2にかかるパラメータaとbとのリストをソートし、そこが行われているどのように多くのcomparisions私に言って、リストの数属性でソートされたリストを返します。

また、私はこの方法をマージ()は、ベクトルxに取り、それをソート

mergesort <- function(x) 
{ 
    l <- length(x) 

    if(l > 1) { 
     p <- ceiling(1/2) 
     a <- mergesort(x[1:p])   
     b <- mergesort(x[(p+1):l]) 
     return(mergelist(a,b))  
    } 
    lister <- list(number=0, data = x) 
    return(lister) 
} 

を持っています。 mergelistと同じnumber属性を持つmergelist()のようなリストを返しています。 mergesort(c(11,10,9,15,6,12,17,8,19,7))

$number [1] 22 
$data [1] 6 7 8 9 10 11 12 15 17 19 

を返す。しかし、それは

$number 
[1] 30 

$data 
[1] 6 7 8 9 10 11 12 15 17 19 

だから、これはそれがどこそれはshouldn比較ですがカウント意味を返す必要があります。

は今私の問題は、私は次の例ということです't。私はどこを知りません。誰かが私が間違っていることを教えてもらえますか?

答えて

0

はあなたのコード

p <- ceiling(**1**/2) 

は、私は十分に感謝することはできません。この

p <- ceiling(**l**/2) 
+0

男のようすべきではありません。 –

+0

うれしかった:) – Prem