不使用Sort方法在Ruby中对数组进行排序

时间:2012-06-19 18:21:17

标签: ruby

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

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

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

7 个答案:

答案 0 :(得分:3)

您错过了end

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

修改 正如另一个答案所提到的那样,缩进代码以使这些错误更加明显。

答案 1 :(得分:3)

end之后你遗漏了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

答案 2 :(得分: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])

答案 3 :(得分: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   

答案 4 :(得分:0)

这看起来更快更好

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)调用上述方法以获取预期结果。

答案 5 :(得分: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

答案 6 :(得分:-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]