使用R语言进行冒泡排序?

时间:2016-03-17 03:29:55

标签: r bubble-sort

我是编程新手,我刚开始学习R语言。我正在尝试进行冒泡排序,但它显示以下错误消息。任何人都可以帮我解决问题吗?

x <-sample(1:100,10)
n <- length(x)
example <- function(x)
{
  for (i in 1:n-1)
  {
   while (x[i] > x[i+1])
      {
      temp <- x[i+1]
      x[i+1] <- x[i]
      x[i] <- temp
      }
  i <- i+1
  }
}

example(x)
  

while(x [i]&gt; x [i + 1]){:参数长度为零

时出错

3 个答案:

答案 0 :(得分:3)

x<-sample(1:100,10)
example <- function(x){
  n<-length(x)
  for(j in 1:(n-1)){
    for(i in 1:(n-j)){
      if(x[i]>x[i+1]){
        temp<-x[i]
        x[i]<-x[i+1]
        x[i+1]<-temp
      }
    }
  }
  return(x)
}
res<-example(x)
#input
x
#output
res

只需对代码进行少量修改即可正常工作。在'R'中最好使用sort()函数。

x <-sample(1:100,10)
x
res<-sort(x)
res

答案 1 :(得分:1)

您的排序算法存在一些不准确之处。我做了一些改动以使其发挥作用。

set.seed(1)
x <-sample(1:100,10)
x
# [1] 27 37 57 89 20 86 97 62 58  6
example <- function(x)
{
  n <- length(x) # better insert this line inside the sorting function
  for (k in n:2) # every iteration of the outer loop bubbles the maximum element 
                 # of the array to the end
  {
    i <- 1       
    while (i < k)        # i is the index for nested loop, no need to do i < n
                         # because passing j iterations of the for loop already 
                         # places j maximum elements to the last j positions
    {
      if (x[i] > x[i+1]) # if the element is greater than the next one we change them
      {
        temp <- x[i+1]
        x[i+1] <- x[i]
        x[i] <- temp
      }
      i <- i+1           # moving to the next element
    }
  }
  x              # returning sorted x (the last evaluated value inside the body 
                 # of the function is returned), we can also write return(x)
}

example(x)
# [1]  6 20 27 37 57 58 62 86 89 97
BTW,R语言有很多功能和方法。这个example函数可以是一个学习示例,但我建议使用现有函数sort来解决实际问题。

在R语言中,您应该尝试避免循环并使用向量化函数来使代码更快。

答案 2 :(得分:0)

它会给您该错误消息,因为他无法比较超出其范围的值(在[x [i]> x [i + 1]]时您会遇到这种情况)。如果要按降序对数组进行排序,请尝试以下方法:

for (i in 1:n){

  j = i

  while((j>1)){
    if ((X[j]> X[j-1])){
    temp = X[j]
    X[j] = X[j-1]
    X[j-1] = temp
    }
    j = j-1
  }

}

对于递增顺序,您只需要在while循环中切换>符号即可。