如何制作可能为空的序列?

How to make sequences that may be empty?

我最近尝试将 some pseudocode 改编为就地快速排序,引用如下:

function quicksort(array)
    if length(array) > 1
        pivot := select any element of array
        left := first index of array
        right := last index of array
        while left ≤ right
            while array[left] < pivot
                left := left + 1
            while array[right] > pivot
                right := right - 1
            if left ≤ right
                swap array[left] with array[right]
                left := left + 1
                right := right - 1
        quicksort(array from first index to right)
        quicksort(array from left to last index)

在此之后,我写了这段代码:

quicksort<-function(array)
{
  len<-length(array)
  if(len>1)
  {
    left<-1
    right<-len
    pivot<-array[(left+right)%/%2]
    while(left<=right)
    {
      while(array[left]<pivot){left<-left+1}
      while(array[right]<pivot){right<-right-1}
      if(left<=right)
      {
        array[c(left,right)]<-array[c(right,left)]
        left<-left+1
        right<-right-1
      }
    }
    array<-quicksort(array[1:right])#Bug here
    array<-quicksort(array[left:len])
  }
  array
}

如果您 运行 此代码将多个整数作为输入,您会发现它最终会尝试对 NA 列表进行排序。我怀疑问题是伪代码希望 array from first index to right - 我的 1:right - 在 right 为零时被读取为空序列。众所周知,R 实际上读作 1:0 作为序列 0 1.

是否有任何函数可以实现我想要的行为?我可以用 if 语句来做到这一点,但 R 通常对序列足够好,我忍不住认为会有更好的方法。我尝试使用 seq,但如果您尝试使用 seq(from=1,to=0,by=1).

之类的内容,它会抛出错误

代码有两个问题:

  1. 其中一个不等号被翻转了。
  2. 数组赋值需要修改为仅更改元素的子集而不是替换(和收缩)整个数组。

这是更正后的代码

quicksort <- function(array) {
  len <- length(array)
  if(len > 1) {
    left <- 1
    right <- len
    pivot <- array[(left+right)%/%2]
    while(left <= right)
    {
      while(array[left] < pivot){ 
        left <- left + 1
      }
      while(array[right] > pivot) { # Changed "<" to ">"
        right <- right - 1
      }
      if(left <= right) {
        array[c(left, right)] <- array[c(right, left)]
        left <- left + 1
        right <- right - 1
      }
    }
    
    # Modified the following two lines to only set a subset of array
    array[1:right] <- quicksort(array[1:right])
    array[left:len] <- quicksort(array[left:len])
  }
  array
}


quicksort(c(2, 6, 3, 1, 4, 5))
#> [1] 1 2 3 4 5 6