[R} 使用 for 循环对元素进行排序时追加的问题

[R} Problems in append when sorting elements using for loop

提问人:ronzenith 提问时间:9/19/2023 更新时间:9/19/2023 访问量:31

问:

我被要求使用 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 的第一个或后续位置的右侧。

如果您能提供建议,将不胜感激。谢谢。

r 排序 for 循环 追加

评论

1赞 ThomasIsCoding 9/19/2023
也许你可以在泡泡排序后 stackoverflow.com/questions/36051165/......

答:

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 是被调用函数的占位符,您也可以将其替换为。Recallf
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