首页 > 解决方案 > 如何制作可能为空的序列?

问题描述

我最近尝试为就地快速排序调整一些伪代码,引用如下:

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

标签: rlistsortingsequencequicksort

解决方案


代码有两个问题:

  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

推荐阅读