对于经验丰富的人来说,答案可能很明显,但我已经看了几个小时的书,我的眼睛很累,似乎找不到错误。
下面是我编写的选择排序的两个实现,但都没有正确地对输入进行排序。您可以在在线解释器上试运行此代码。
def selection_sort_enum(array)
n = array.length - 1
0.upto(n - 1) do |i|
smallest = i
(i + 1).upto(n) do |j|
smallest = j if array[j] < array[i]
end
array[i], array[smallest] = array[smallest], array[i] if i != smallest
end
end
def selection_sort_loop(array)
n = array.length - 1
i = 0
while i <= n - 1
smallest = i
j = i + 1
while j <= n
smallest = j if array[j] < array[i]
j += 1
end
array[i], array[smallest] = array[smallest], array[i] if i != smallest
i += 1
end
end
这是第一个实现的测试,
selection_sort_enum
:puts "Using enum:"
a1 = [*1..10].shuffle
puts "Before sort: #{a1.inspect}"
selection_sort_enum(a1)
puts "After sort: #{a1.inspect}"
这是第二个实现的测试,即
selection_sort_loop
:puts "Using while:"
a2 = [*1..10].shuffle
puts "Before sort: #{a2.inspect}"
selection_sort_enum(a2)
puts "After sort: #{a2.inspect}"
以下是第一种实现方法
selection_sort_enum
的输出结果:Using enum:
Before sort: [7, 5, 2, 10, 6, 1, 3, 4, 8, 9]
After sort: [4, 3, 1, 9, 5, 2, 6, 7, 8, 10]
以下是第二种实现方法
selection_sort_loop
的输出结果:Using while:
Before sort: [1, 10, 5, 3, 7, 4, 8, 9, 6, 2]
After sort: [1, 2, 4, 3, 6, 5, 7, 8, 9, 10]
selection_sort_enum!
,因为你正在改变原始数组。如果要创建一个新的排序数组,只需将第一行更改为def selection_sort_enum(arr); array = arr.dup
。 - Cary Swoveland