我正在尝试将冒泡排序方法应用到Ruby的简单编程问题中,但我遇到了一些麻烦。我理解的方法是先比较第一个元素的值和第二个元素的值,然后根据需要进行交换,但我无法在实际问题中实现它。是否有人愿意提供一个简短的例子,说明这在Ruby中如何工作?
我正在尝试将冒泡排序方法应用到Ruby的简单编程问题中,但我遇到了一些麻烦。我理解的方法是先比较第一个元素的值和第二个元素的值,然后根据需要进行交换,但我无法在实际问题中实现它。是否有人愿意提供一个简短的例子,说明这在Ruby中如何工作?
使用 while 循环正确实现冒泡排序
def bubble_sort(list)
return list if list.size <= 1 # already sorted
swapped = true
while swapped do
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] # swap values
swapped = true
end
end
end
list
end
upto
循环未排序索引。由于我无法将答案添加到此问题中,请检查 gist:https://gist.github.com/shanshaji/5da49d1177cdf1cdc981f3dacc005b56 - Shanarr = [4,2,5,1]
loop until arr.each_cons(2).with_index.none?{|(x,y),i| arr[i],arr[i+1] = y,x if x > y}
p arr #=> [1, 2, 4, 5]
def bubble_sort(list)
return list if list.size <= 1 # already sorted
loop do
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] # swap values
swapped = true
end
end
break unless swapped
end
list
end
def bubble_sort(list)
iterations = list.size - 2
return list unless iterations > 0 # already sorted
swaps = 2
while swaps > 1 do
swaps = 0
0.upto(iterations) do |i|
if list[i] > list[i + 1]
list[i], list[i + 1] = list[i + 1], list[i] # swap values
swaps += 1
end
end
iterations -= 1
end
list
end
运行这个测试所需时间缩短了25%。
that_array = this_array = [22,66,4,44,5,7,392,22,8,77,33,118,99,6,1,62,29,14,139,2]
49.times {|variable| that_array = that_array + this_array}
bubble_sort that_array
只是重新编写@VanDarg的代码,使用while循环 (注意:代码未经测试...自行承担风险)
def bubble_sort(list)
return list if list.size <= 1 # already sorted
swapped = true
while swapped
swapped = false # maybe this time, we won't find a swap
0.upto(list.size-2) do |i|
if list[i] > list[i+1]
list[i], list[i+1] = list[i+1], list[i] # swap values
swapped = true # found a swap... keep going
end
end
end
list
end
编辑:更新了交换值,因为冒泡排序在仍有交换发生时会继续排序 - 一旦它不再发现任何交换,它就停止排序。请注意,这并不遵循@Doug的代码,但符合@cLuv的修复。
def bubble_sort array
array.each do
swap_count = 0
array.each_with_index do |a, index|
break if index == (array.length - 1)
if a > array[index+1]
array[index],array[index+1] = array[index +1], array[index]
swap_count += 1
end
end
break if swap_count == 0 # this means it's ordered
end
array
end
另一种稍微不同的命名方式。
def bubble_sort(list)
return list if list.size <= 1
not_sorted = true
while not_sorted
not_sorted = false
0.upto(list.size - 2) do |i|
if list[i] > list[i + 1]
list[i], list[i + 1] = list[i + 1], list[i]
not_sorted = true
end
end
end
list
end
def bubbleSort(list)
sorted = false
until sorted
sorted = true
for i in 0..(list.length - 2)
if list[i] > list[i + 1]
sorted = false
list[i], list[i + 1] = list[i + 1], list[i]
end
end
end
return list
end
这是我的看法,使用异或运算符:
def bubble(arr)
n = arr.size - 1
k = 1
loop do
swapped = false
0.upto(n-k) do |i|
if arr[i] > arr[i+1]
xor = arr[i]^arr[i+1]
arr[i] = xor^arr[i]
arr[i+1] = xor^arr[i+1]
swapped = true
end
end
break unless swapped
k +=1
end
return arr
end