【问题标题】:Number of comparisons in mergesort in RR中合并排序中的比较次数
【发布时间】:2017-07-01 17:45:42
【问题描述】:

我正在 R 中编写合并排序。我有 2 个函数。第一个是mergelist()

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,并返回一个排序列表,列表的 number 属性告诉我进行了多少次比较。

我也有这个方法mergesort()

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)
}

它接受一个向量 x 并对其进行排序。它返回一个类似于 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

所以这意味着它会在不应该的地方进行比较。我不知道在哪里。谁能告诉我我做错了什么?

【问题讨论】:

    标签: r sorting


    【解决方案1】:

    你的代码不应该

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

    像这样

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

    【讨论】:

    • 很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 2017-03-19
    • 2015-07-09
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2021-09-02
    • 2010-12-03
    相关资源
    最近更新 更多