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

问题描述 投票:0回答:2

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

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

r sorting for-loop append
2个回答
2
投票

您可以定义一个递归函数

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

2
投票

这是冒泡排序的一个版本。
冒泡排序是一个坏主意,我在 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

© www.soinside.com 2019 - 2024. All rights reserved.