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

Posted

技术标签:

【中文标题】使用R语言进行冒泡排序?【英文标题】:Bubble sort using R language? 【发布时间】:2016-07-03 05:55:49 【问题描述】:

我是编程新手,刚开始学习 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] > x[i + 1]) : 参数长度为零时出错

【问题讨论】:

旁白:1:n-1 应该是1:(n-1) 此外,该函数不返回任何内容。也许还有其他问题? 除了 Richard 所说的,试试 1:10-11:(10-1) 看看为什么会出现这个错误。 我现在没有看到任何错误消息。但似乎“While”和“for”循环根本不起作用。结果显示原始 X,未排序 X。有什么意见吗? @Andy,你指定返回值了吗? 【参考方案1】:
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

【讨论】:

【参考方案2】:

您的排序算法有一些不准确之处。我已经进行了更改以使其正常工作。

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

顺便说一句,R语言有很多做事的函数和方法。这个example 函数可以作为一个学习示例,但我建议使用现有函数sort 来解决实际问题。

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

【讨论】:

我知道使用 temp 变量是交换两个变量的经典方法,但在 R 中你可以这样做 x[c(i,i+1)] = x[c(i+1,i)]【参考方案3】:

它给你这个错误信息,因为他无法比较一个超出他界限的值,你在 (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 循环中切换 > 符号。

【讨论】:

以上是关于使用R语言进行冒泡排序?的主要内容,如果未能解决你的问题,请参考以下文章

用Java编程语言对一个无序整形数组进行排序(冒泡排序,选择排序,插入排序)

冒泡排序

冒泡排序和选择排序(C语言)

排序算法之一--冒泡排序,选择排序,插入排序

Go语言冒泡排序

C语言之冒泡排序