r - 如何制作可能为空的序列?
问题描述
我最近尝试为就地快速排序调整一些伪代码,引用如下:
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
推荐阅读
- laravel-8 - 作曲家需要 designmynight/laravel-mongodb-passport 未安装在 laravel8 中
- c# - 失去焦点时自定义文本框值消失
- laravel - 未找到 Laravel 8 路线
- angular - Wait for subscription in the same function
- python - 在时间序列数据帧上仅在 groupby 之后获取序列
- https - HttpService 的 NestJs 超时问题
- amazon-web-services - AWS ASG 错误状态转换原因 Server.InternalError
- xamarin - 如何在 Xamarin 中自定义包含文本的进度条
- docker - 有没有办法将 action.yml 与容器存储库的 GitHub 操作一起使用
- database - 如何在颤动中循环表单数据条目