我正在尝试使用冒泡排序方法对只有三个数字的数组进行排序。我正在使用的代码如下。
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
我只是想知道不应该包括哪一端?
答案 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]