我被要求仅使用for循环将包含随机顺序数字的向量重新排列为降序。
#请运行这两行代码
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 第一个或后续位置的右侧。
如果您能提供建议,我将不胜感激。非常感谢。
您可以定义一个递归函数
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(num)
[1] 96 87 74 45 37 26 14 11 6 4
这是冒泡排序的一个版本。
冒泡排序是一个坏主意,我在 StackExchange 上搜索了一个 Q/A,其中提到了这个求职面试问题,但找不到。
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