2

我正在尝试使用冒泡排序方法对只有三个数字的数组进行排序。我正在使用的代码如下。

def my_sort(list)
  return list if list.size <= 1 

  swapped = false

  while !swapped
    swapped = false

    0.upto(list.size-2) do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end

    list
  end

my_sort([3,1,2])

这是我不断收到的错误消息:

Syntax error, unexpected $end, expecting keyword_end

我只是想知道不应该包括哪一端?

4

7 回答 7

3

你错过了一个end

  if list[i] > list[i+1]
    list[i], list[i+1] = list[i+1], list[i]
    swapped = true
  end # <--------------------------------------------------------

编辑: 正如其他答案所提到的,缩进您的代码以使这些错误更加明显。

于 2012-06-19T18:27:03.017 回答
3

你缺少一个endafter swapped = true。最好彻底准确地缩进代码以避免此类问题:

def my_sort(list)
  return list if list.size <= 1 

  swapped = false
  while !swapped
    swapped = false
    0.upto(list.size-2) do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end
  end

  list
end
于 2012-06-19T18:27:33.280 回答
2

这看起来更好更快

arr = [1,5,7,2,3,50,78,34, 1, 15, 89, 8]

def sort_array(arr)
  arr.size.times do
    arr.map.with_index do |num, index|
      next if index.eql?(arr.size - 1)
      arr[index], arr[index+1] = arr[index+1], arr[index] if num > arr[index+1]
    end
  end
end

调用上述方法print sort_array(arr)以获得预期的结果。

于 2019-11-09T22:07:29.710 回答
1

您的代码适用于该特定数组。因为您的循环正在查看下一个元素是否更高,然后滑动。但是数组中的更多元素呢?这是适用于所有情况的递归解决方案。

def my_sort(list, new_array = nil)

  return new_array if list.size <= 0
  if new_array == nil
    new_array = []
  end
  min = list.min
  new_array << min
  list.delete(min)

  my_sort(list, new_array)

end

puts my_sort([3, 1, 2, 20, 11, 14, 3, 6, 8, 5])
于 2016-07-10T22:41:39.077 回答
0

对我有用的方法如下。

def my_sort(list)   
  n = list.length   
  loop do
    swapped = false
    (n-1).times do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end
    break if not swapped  
  end   
  list 
end   
于 2019-04-04T10:30:41.053 回答
0
def sort(arr)
    arr_len = arr.length - 1
    swap = true
    while swap
        swap = false
        arr_len.times do |i|
         if arr[i] > arr[i+1]
           arr[i],arr[i + 1] = arr[i + 1],arr[i]
           swap = true
         end
        end
     end
     p arr

end
于 2020-11-19T11:18:05.777 回答
-1
#Using bubble sort algorithm in ruby

a = [1,5,7,2,3,50,78,34,89]

a.size.times.each do |t|
 i=0
 a.each do |b|
   if b > a[i+1]
     a[i],a[i+1] = a[i+1],a[i]
   end
   i+=1 if i < a.size-2
 end
end
print a
#output: [1, 2, 3, 5, 7, 34, 50, 78, 89]
于 2017-09-15T00:17:01.173 回答