如何解决如何制作可能为空的序列?
我最近尝试将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)
的方法,则会引发错误。
解决方法
代码有两个问题:
- 不等号之一被翻转。
- 需要修改数组分配,以仅更改元素的子集,而不是替换(并收缩)整个数组。
这是更正的代码
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。