创建向量子集添加空值

时间:2018-01-30 06:39:30

标签: r vector mergesort

我试图在R中创建一个mergeSort算法。虽然我认为我的方法已经关闭,但是我第一次创建向量e时,我最终得到了一个长度为4而不是2的向量。这会导致以下错误:

  
    

" if(a [2]< a [1]){:缺失值需要TRUE / FALSE"

  

出于某种原因,R正在向应该是双元素向量添加额外的2个元素。如果有人对此有解释,那将是美好的。 (请限制解决此错误的建议。我想弄清楚如何自己完成剩下的工作。)

代码:

addLeftOver <- function(buffer, array, index) {
  j <- length(buffer)
  for(i in array[index:length(array)]) {
    buffer[j] = i
    print(i)
    j <- j+1
  }
  return(buffer)
}

mergeSort <- function(a) {
  len <- length(a)
  print(a)
  print(len)
  browser()
  if(len<=2) {  #base case
    if(len==1) {
      return(a)
    }
    if(a[2]<a[1]) {
      return(c(a[2],a[1]))
    }
    return(a)
  }
  print(len/2)
  b <- mergeSort(a[1:(len/2)])     #recursion
  e <- mergeSort(a[(len/2)+1:len]) #recursion
  indexB <- 1
  indexE <- 1
  buffer

  for(i in 1:len) {
    if(e[indexC]<b[indexB]) {
      buffer[index] <- e[indexE]
      index <- index + 1
      indexE <- indexE + 1
    } else {
      buffer[index] <- b[indexB]
      index <- index + 1
      indexB <- indexB + 1
    }
    if(indexB==len/2) {
      buffer = addLeftover(buffer, e, indexE)
      return(buffer)
    }
    if(indexE==len/2) {
      buffer = addLeftover(buffer, b, indexB)
      return(buffer)
    }
  }
}

sumArray <- c(6,4,2,7,8,1,3,5)
print(mergeSort(sumArray))

addLeftOver()函数的目的是将另一个向量(be)中的一个的残余复制到另一个向量的末尾。达到。

1 个答案:

答案 0 :(得分:0)

主要错误可以用括号修复。 e <- mergeSort(a[(len/2)+1:len])应为e <- mergeSort(a[((len/2)+1:len]) 那个和其他一些错误是固定的。
工作代码:

addLeftOver <- function(buffer, array, index) 
{
 j <- length(buffer)+1
 for(i in array[index:length(array)]) {
   buffer[j] = i
   j <- j+1
 }
 return(buffer)
}

mergeSort <- function(a)
{
  len <- length(a)
  if(len<=2)
  {
    if(len==1)
    {
      return(a)
    }
    if(a[2]<a[1])
    {
      return(c(a[2],a[1]))
    }
    return(a)
  }
  half <- as.integer(len/2)
  b <- mergeSort(a[1:(half)])
  e <- mergeSort(a[((half)+1):len])
  index <- 1
  indexB <- 1
  indexE <- 1
  buffer <- c(0)

  for(i in 1:len)
  {
    if(e[indexE]<b[indexB])
    {
      buffer[index] <- e[indexE]
      index <- index + 1
      indexE <- indexE + 1
    }
    else
    {
      buffer[index] <- b[indexB]
      index <- index + 1
      indexB <- indexB + 1
    }
    if(indexB==(length(b))+1)
    {
      buffer = addLeftover(buffer, e, indexE)
      return(buffer)
    }
    if(indexE==(length(e))+1)
    {
      buffer = addLeftover(buffer, b, indexB)
      return(buffer)
    }
  }
}