代码之家  ›  专栏  ›  技术社区  ›  Hendrra

R中Heapsort算法的实现问题

  •  1
  • Hendrra  · 技术社区  · 5 年前

    我想在R中创建自己的Heapsort算法。
    那是我的密码

    heapify <- function(array, n, i)
    {
      parent <- i
      leftChild <- 2 * i + 1
      rightChild <- 2 * i + 2
    
      if ((leftChild < n) & (array[parent] < array[leftChild]))
      {
        parent = leftChild
      }
    
      if ((rightChild < n) & (array[parent] < array[rightChild]))
      {
        parent = rightChild
      }
    
      if (parent != i)
      {
        array = replace(array, c(i, parent), c(array[parent], array[i]))
        heapify(array, n, parent)
      }
    }
    
    heapSort <- function(array)
    {
      n <- length(array)
    
      for (i in (n+1):1)
      {
        heapify(array, n, i)
      }
    
      for (i in n:1)
      {
        array = replace(array, c(i, 0), c(array[0], array[i]))
        heapify(array, i, 1)
      }
      print(array)
    }
    

    然而,这种实施似乎是不正确的。这是一个输入和输出的例子。

    array <- c(5, 14, 3, 70, 64)
    heapSort(array)
    
    Output: [1]  5 14  3 70 64
    

    0 回复  |  直到 5 年前
        1
  •  2
  •   Joseph Wood    5 年前

    我猜你是想把上面的算法 GeeksforGeeks 他们在许多基于零的语言中实现这一点。这是问题的来源之一(R开始索引为1而不是0)。

    基本零标引问题:

                             ## We also need to swap these indices
    array = replace(array, c(i, 0), c(array[0], array[i]))
    heapify(array, i, 1)
    
    Should be:
    
    array <- replace(array, c(i, 1), array[c(1, i)])
    array <- heapify(array, i, 1)
    

    例2:

    leftChild <- 2 * i + 1
    rightChild <- 2 * i + 2
    
    Should be:
    
    leftChild <- 2 * (i - 1) + 1
    rightChild <- 2 * (i - 1) + 2
    

    通过参考假设

    在R中,不能通过引用传递对象(请参见此问答 Can you pass-by-reference in R?

    heapify 我们必须回去 array 健康 阵列 输出。

    以下是修订后的法典:

    heapify <- function(array, n, i)
    {
        parent <- i
        leftChild <- 2 * (i - 1) + 1
        rightChild <- 2 * (i - 1) + 2
    
        if ((leftChild < n) & (array[parent] < array[leftChild]))
        {
            parent <- leftChild
        }
    
        if ((rightChild < n) & (array[parent] < array[rightChild]))
        {
            parent <- rightChild
        }
    
        if (parent != i) {
            array <- replace(array, c(i, parent), array[c(parent, i)])
            array <- heapify(array, n, parent)
        }
    
        array
    }
    
    heapSort <- function(array)
    {
        n <- length(array)
    
        for (i in floor(n / 2):1) {
            array <- heapify(array, n, i)
        }
    
        for (i in n:1) {
            array <- replace(array, c(i, 1), array[c(1, i)])
            array <- heapify(array, i, 1)
        }
    
        array
    }
    

    array <- c(5, 14, 3, 70, 64)
    heapSort(array)
    [1]  3  5 14 64 70
    
    set.seed(11)
    largerExample <- sample(1e3)
    
    head(largerExample)
    [1] 278   1 510  15  65 951
    
    identical(heapSort(largerExample), 1:1e3)
    [1] TRUE