提问人:ronzenith 提问时间:9/19/2023 更新时间:9/19/2023 访问量:31
[R} 使用 for 循环对元素进行排序时追加的问题
[R} Problems in append when sorting elements using for loop
问:
我被要求只使用 for 循环将包含数字的向量以随机顺序重新排列为降序。
#please 运行以下两行代码
set.seed(114324)
num <- sample(100,10) #return 96 4 87 11 74 6 37 45 14 26
我的尝试失败了。
mx = c(-Inf)
for (i in 1:10){
for (j in 1:10){
if (num[i] > mx[j]){
mx <- append(num[i], mx, i)
} else {
mx <- append(mx, num[i])
}
}
}
mx
我的想法是比较 num 的每个元素并一个接一个地排列元素。如果该数字大于 mx 中的第一个数字,则它将被放置在最左侧的位置。如果没有,它将被放置在 mx 的第一个或后续位置的右侧。
如果您能提供建议,将不胜感激。谢谢。
答:
2赞
ThomasIsCoding
9/19/2023
#1
您可以定义一个递归函数,如下所示f
f <- function(v) {
if (length(v) == 1) {
return(v)
}
mx <- -Inf
k <- 0
for (i in seq_along(v)) {
if (v[i] >= mx) {
mx <- v[i]
k <- i
}
}
append(mx, Recall(v[-k]))
}
或非递归变体(可能更快一点)
f <- function(v) {
res <- c()
repeat {
if (length(v) == 0) {
return(res)
}
mx <- -Inf
k <- 0
for (i in seq_along(v)) {
if (v[i] >= mx) {
mx <- v[i]
k <- i
}
}
res <- append(res, mx)
v <- v[-k]
}
}
您将获得所需的降序
> f(num)
[1] 96 87 74 45 37 26 14 11 6 4
评论
0赞
ronzenith
9/19/2023
谢谢。这是我第一次知道 Recall()。让我搜索一下它的含义。
1赞
ThomasIsCoding
9/19/2023
@ronzenith 是被调用函数的占位符,您也可以将其替换为。Recall
f
2赞
Rui Barradas
9/19/2023
#2
这是气泡排序的一个版本。
气泡排序是个坏主意,我已经在 StackExchange 上搜索了提到这个求职面试问题的问答,但找不到。
bubble <- function(x) {
for(m in seq_along(x)[-1L]) {
for(i in length(x):m) {
if(x[i - 1L] < x[i]) {
tmp <- x[i - 1L]
x[i - 1L] <- x[i]
x[i] <- tmp
}
}
}
x
}
set.seed(114324)
num <- sample(100,10) #return 96 4 87 11 74 6 37 45 14 26
bubble(num)
#> [1] 96 87 74 45 37 26 14 11 6 4
创建于 2023-09-19 使用 reprex v2.0.2
编辑
这些问题要求降序,但为了完整起见,这里有一个也可以按升序排序的版本。其默认值为降序。
bubble <- function(x, descending = TRUE) {
op <- if(descending) `<` else `>`
for(m in seq_along(x)[-1L]) {
for(i in length(x):m) {
if(op(x[i - 1L], x[i])) {
tmp <- x[i - 1L]
x[i - 1L] <- x[i]
x[i] <- tmp
}
}
}
x
}
bubble(num)
#> [1] 96 87 74 45 37 26 14 11 6 4
bubble(num, FALSE)
#> [1] 4 6 11 14 26 37 45 74 87 96
创建于 2023-09-19 使用 reprex v2.0.2
评论